{"id":3346,"date":"2017-08-21T15:21:56","date_gmt":"2017-08-21T15:21:56","guid":{"rendered":"https:\/\/answers.gurussolutions.com\/answers\/how-to-retrieve-time-entry-details-from-netsuite-invoices-using-suitescript-2-x-2\/"},"modified":"2026-07-28T18:25:42","modified_gmt":"2026-07-28T18:25:42","slug":"comment-extraire-les-details-des-saisies-de-temps-a-partir-des-factures-netsuite-a-laide-de-suitescript-2-x","status":"publish","type":"qa_entry","link":"https:\/\/answers.gurussolutions.com\/fr\/answers\/comment-extraire-les-details-des-saisies-de-temps-a-partir-des-factures-netsuite-a-laide-de-suitescript-2-x\/","title":{"rendered":"Comment extraire les d\u00e9tails des saisies de temps \u00e0 partir des factures NetSuite \u00e0 l&rsquo;aide de SuiteScript 2.x"},"content":{"rendered":"","protected":false},"template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","ga_subtitle":"D\u00e9couvrez comment acc\u00e9der par programmation aux enregistrements de saisie de temps li\u00e9s \u00e0 une facture dans NetSuite, en utilisant SuiteScript 2.x pour l'extraction de donn\u00e9es d\u00e9taill\u00e9es.","ga_short_answer":"Pour r\u00e9cup\u00e9rer les valeurs des saisies de temps \u00e0 partir d\u2019une facture dans NetSuite, utilisez SuiteScript 2.x pour charger l\u2019enregistrement de la facture et parcourir sa sous-liste \u00ab timeitem \u00bb. Extrayez l\u2019identifiant interne de chaque saisie de temps associ\u00e9e \u00e0 partir du champ correspondant de la sous-liste. Une fois ces identifiants obtenus, vous pouvez charger ou rechercher les enregistrements individuels de saisies de temps afin d\u2019acc\u00e9der \u00e0 toutes les informations requises.","ga_scenario":"Les utilisateurs de NetSuite ont souvent besoin d\u2019acc\u00e9der par programmation aux informations d\u00e9taill\u00e9es des saisies de temps li\u00e9es \u00e0 une facture sp\u00e9cifique. Bien que la cr\u00e9ation directe de rapports via des recherches enregistr\u00e9es puisse s\u2019av\u00e9rer complexe pour ce lien sp\u00e9cifique, la r\u00e9cup\u00e9ration de ces donn\u00e9es est essentielle pour la cr\u00e9ation de rapports personnalis\u00e9s, les int\u00e9grations ou la logique m\u00e9tier avanc\u00e9e. La difficult\u00e9 r\u00e9side dans l\u2019identification des identifiants de sous-liste et de champ corrects permettant d\u2019extraire les r\u00e9f\u00e9rences des saisies de temps \u00e0 partir de l\u2019enregistrement de la facture.","ga_solution":"L'acc\u00e8s aux valeurs des saisies de temps \u00e0 partir d'un enregistrement de facture dans NetSuite implique principalement l'utilisation de SuiteScript 2.x pour interagir avec les sous-listes de l'enregistrement. Bien que l'acc\u00e8s direct via des recherches enregistr\u00e9es pour ce lien sp\u00e9cifique puisse n\u00e9cessiter des techniques avanc\u00e9es telles que SuiteQL ou des configurations sp\u00e9cifiques, la m\u00e9thode la plus fiable consiste \u00e0 utiliser des scripts.\n\n1.  **Identification de la sous-liste et du champ des saisies de temps :**\n    La sous-liste d\u2019une facture contenant les saisies de temps associ\u00e9es est g\u00e9n\u00e9ralement `timeitem`. L\u2019identifiant du champ au sein de cette sous-liste qui contient l\u2019identifiant interne de l\u2019enregistrement de saisie de temps doit \u00eatre v\u00e9rifi\u00e9 \u00e0 l\u2019aide du navigateur d\u2019enregistrements NetSuite ou en inspectant le code source de la page. Avec SuiteScript 1.0, il s\u2019agissait souvent de GA_KEEP_0002, mais cela peut varier dans les impl\u00e9mentations de SuiteScript 2.x ou les configurations personnalis\u00e9es.\n\n2.  **R\u00e9cup\u00e9rer les identifiants des saisies de temps \u00e0 partir d\u2019une facture :**\n    Les identifiants des saisies de temps peuvent \u00eatre r\u00e9cup\u00e9r\u00e9s soit en chargeant l\u2019enregistrement de la facture, soit en acc\u00e9dant directement aux valeurs des lignes de commande dans un script c\u00f4t\u00e9 serveur ou c\u00f4t\u00e9 client.\n\n    *   **\u00c0 l\u2019aide de `record.getSublistValue()` (par exemple, dans un script client ou un script d\u2019\u00e9v\u00e9nement utilisateur) :**\n\n```\njavascript\n        \/**\n         * @NApiVersion 2.x\n         * @NModuleScope SameAccount\n         *\/\n        define(['N\/record'], function(record) {\n            function exampleFunction() {\n                \/\/ Assuming 'currentRecord' is available in client scripts or loaded in user event scripts\n                \/\/ For a client script, use currentRecord.get()\n                \/\/ For a user event script, use scriptContext.newRecord\n                var invoiceRecord = currentRecord.get(); \/\/ Or record.load('invoice', invoiceId);\n                var lineCount = invoiceRecord.getLineCount({ sublistId: 'timeitem' });\n                var timeEntryIds = [];\n\n                for (var i = 0; i < lineCount; i++) {\n                    var timeEntryId = invoiceRecord.getSublistValue({\n                        sublistId: 'timeitem',\n                        fieldId: 'linkedtimeentryid', \/\/ Placeholder: Verify actual field ID in Records Browser\n                        line: i\n                    });\n                    if (timeEntryId) {\n                        timeEntryIds.push(timeEntryId);\n                    }\n                }\n                log.debug('Time Entry IDs', timeEntryIds);\n            }\n            return {\n                \/\/ Expose functions as needed\n            };\n        });\n```\n\n    *   **Chargement de l\u2019enregistrement de facture avec `record.load()` :**\n\n```\njavascript\n        \/**\n         * @NApiVersion 2.x\n         * @NModuleScope SameAccount\n         *\/\n        define(['N\/record'], function(record) {\n            function loadInvoiceAndGetTimeEntries(invoiceId) {\n                var invoiceRecord = record.load({\n                    type: record.Type.INVOICE,\n                    id: invoiceId,\n                    isDynamic: false\n                });\n\n                var lineCount = invoiceRecord.getLineCount({ sublistId: 'timeitem' });\n                var timeEntryIds = [];\n\n                for (var i = 0; i < lineCount; i++) {\n                    var timeEntryId = invoiceRecord.getSublistValue({\n                        sublistId: 'timeitem',\n                        fieldId: 'linkedtimeentryid', \/\/ Placeholder: Verify actual field ID in Records Browser\n                        line: i\n                    });\n                    if (timeEntryId) {\n                        timeEntryIds.push(timeEntryId);\n                    }\n                }\n                log.debug('Time Entry IDs for Invoice ' + invoiceId, timeEntryIds);\n                return timeEntryIds;\n            }\n            return {\n                \/\/ Expose functions as needed\n            };\n        });\n```\n\n3.  **Acc\u00e9der aux d\u00e9tails des saisies de temps :**\n    Une fois les identifiants internes des enregistrements de temps obtenus, vous pouvez soit charger chaque enregistrement de temps individuel (type d\u2019enregistrement `timebill`) pour acc\u00e9der \u00e0 ses champs sp\u00e9cifiques, soit <a class=\"ga-interlink\" href=\"https:\/\/answers.gurussolutions.com\/fr\/answers\/how-do-netsuite-suitescript-1-0-search-apis-differ-nlapiloadsearch-vs-nlapisearchrecord\/\">effectuer une recherche sur le<\/a> type d\u2019enregistrement `timebill` \u00e0 l\u2019aide d\u2019un tableau contenant ces identifiants internes afin de r\u00e9cup\u00e9rer efficacement plusieurs valeurs.\n\n```\njavascript\n    \/**\n     * @NApiVersion 2.x\n     * @NModuleScope SameAccount\n     *\/\n    define(['N\/record', 'N\/search'], function(record, search) {\n        function getTimeEntryDetails(timeEntryIds) {\n            if (!timeEntryIds || timeEntryIds.length === 0) {\n                return [];\n            }\n\n            var timeEntrySearch = search.create({\n                type: record.Type.TIME_BILL, \/\/ 'timebill'\n                filters: [\n                    ['internalid', 'anyof', timeEntryIds]\n                ],\n                columns: [\n                    'employee',\n                    'item',\n                    'hours',\n                    'memo'\n                    \/\/ Add other desired columns from the time entry record\n                ]\n            });\n\n            var results = [];\n            timeEntrySearch.run().each(function(result) {\n                results.push({\n                    id: result.id,\n                    employee: result.getText('employee'),\n                    item: result.getText('item'),\n                    hours: result.getValue('hours'),\n                    memo: result.getValue('memo')\n                });\n                return true;\n            });\n            log.debug('Time Entry Details', results);\n            return results;\n        }\n        return {\n            \/\/ Expose functions as needed\n        };\n    });\n```","ga_source_author":"","ga_source_author_email":"","ga_date_original":"2017-08-21T11:21:56-04:00","ga_date_verified":"2026-07-05","ga_source_subject":"How to get the Time Entry values from an Invoice?","ga_ans_id":"ANS-1607","ga_publish_decision":"publish_with_edits","ga_staleness_risk":"high","ga_review_priority":"spot_check","ga_tier2_verdict":"partially_outdated","ga_tier2_concerns":"The scripting functions `nlapiGetLineItemValue()` and `nlapiLoadRecord()` are from SuiteScript 1.0, which has been largely superseded by SuiteScript 2.x. Current best practice uses the `N\/record` module and its methods like `record.load()` and `record.getSublistValue()`.; The claim 'There is no way to get that information through Saved Searches' is likely outdated. While direct access might be complex, current documentation and community discussions suggest that time entries can be linked to invoices via saved searches on the Time Bill record or using SuiteQL.; The specific sublist ID 'time' and field ID 'doc' for the time entry ID are likely specific to SuiteScript 1.0 or a less common internal ID. In SuiteScript 2.x, the Time Entry record type is 'timebill', and the sublist on an invoice for billable time is often referred to as 'timeitem'. The exact field ID for the linked time entry on the invoice sublist would need to be verified via the NetSuite Records Browser or inspection.","ga_final_category":"SuiteScript Development","footnotes":""},"ga_category":[108,23,108],"ga_audience":[10],"ga_difficulty":[92],"class_list":["post-3346","qa_entry","type-qa_entry","status-publish","hentry","ga_category-developpement-suitescript","ga_category-suitescript-development","ga_audience-developer-suitescript","ga_difficulty-niveau-intermediaire"],"taxonomy_info":{"ga_category":[{"value":108,"label":"D\u00e9veloppement SuiteScript"},{"value":23,"label":"SuiteScript Development"},{"value":108,"label":"D\u00e9veloppement SuiteScript"}],"ga_audience":[{"value":10,"label":"Developer\/SuiteScript"}],"ga_difficulty":[{"value":92,"label":"Niveau interm\u00e9diaire"}]},"featured_image_src_large":[],"author_info":[],"comment_info":"","_links":{"self":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry"}],"about":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/types\/qa_entry"}],"version-history":[{"count":1,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3346\/revisions"}],"predecessor-version":[{"id":5266,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3346\/revisions\/5266"}],"wp:attachment":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=3346"}],"wp:term":[{"taxonomy":"ga_category","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_category?post=3346"},{"taxonomy":"ga_audience","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_audience?post=3346"},{"taxonomy":"ga_difficulty","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_difficulty?post=3346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}