{"id":2697,"date":"2017-08-21T15:11:53","date_gmt":"2017-08-21T15:11:53","guid":{"rendered":"https:\/\/answers.gurussolutions.com\/answers\/how-to-overcome-client-side-permission-restrictions-with-suitelets-in-netsuite-2\/"},"modified":"2026-07-28T18:25:08","modified_gmt":"2026-07-28T18:25:08","slug":"comment-contourner-les-restrictions-dautorisation-cote-client-avec-les-suitelets-dans-netsuite","status":"publish","type":"qa_entry","link":"https:\/\/answers.gurussolutions.com\/fr\/answers\/comment-contourner-les-restrictions-dautorisation-cote-client-avec-les-suitelets-dans-netsuite\/","title":{"rendered":"Comment contourner les restrictions d&rsquo;autorisation c\u00f4t\u00e9 client avec les Suitelets dans NetSuite"},"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":"Utilisez les Suitelets \u00ab Run As Admin \u00bb pour acc\u00e9der en toute s\u00e9curit\u00e9 aux enregistrements NetSuite externes et les modifier \u00e0 partir de scripts c\u00f4t\u00e9 client, en contournant les restrictions d'autorisation propres \u00e0 chaque utilisateur.","ga_short_answer":"Les scripts c\u00f4t\u00e9 client dans NetSuite fonctionnent selon les autorisations de l\u2019utilisateur, ce qui limite l\u2019acc\u00e8s aux enregistrements en dehors du contexte actuel. Pour contourner cette limitation, mettez en place un Suitelet \u00ab Run As Admin \u00bb (Ex\u00e9cuter en tant qu\u2019administrateur) servant d\u2019interm\u00e9diaire. Ce Suitelet peut effectuer des recherches ou des mises \u00e0 jour d\u2019enregistrements avec des autorisations \u00e9lev\u00e9es, puis renvoyer les donn\u00e9es n\u00e9cessaires au script c\u00f4t\u00e9 client, garantissant ainsi un acc\u00e8s s\u00e9curis\u00e9 et sans restriction aux donn\u00e9es.","ga_scenario":"Les scripts c\u00f4t\u00e9 client de NetSuite sont intrins\u00e8quement limit\u00e9s par les autorisations de l\u2019utilisateur actuellement connect\u00e9. Cette restriction peut emp\u00eacher les scripts de <a class=\"ga-interlink\" href=\"https:\/\/answers.gurussolutions.com\/fr\/answers\/can-netsuite-subrecords-be-edited-in-client-side-or-before-load-user-event-scripts\/\">lire ou d\u2019\u00e9crire des donn\u00e9es dans des types d\u2019enregistrements autres que celui sur lequel le script s\u2019ex\u00e9cute actuellement<\/a>. Les d\u00e9veloppeurs rencontrent souvent des difficult\u00e9s lorsqu\u2019un script c\u00f4t\u00e9 client doit interagir avec des enregistrements externes mais se heurte \u00e0 des \u00e9checs li\u00e9s aux autorisations.","ga_solution":"Bien que les scripts d\u2019\u00e9v\u00e9nements utilisateur puissent \u00eatre configur\u00e9s pour s\u2019ex\u00e9cuter en mode \u00ab Run As Admin \u00bb (Ex\u00e9cuter en tant qu\u2019administrateur) afin d\u2019acc\u00e9der \u00e0 n\u2019importe quel enregistrement sans restriction d\u2019autorisation, cette fonctionnalit\u00e9 n\u2019est pas disponible pour les scripts c\u00f4t\u00e9 client. Les scripts c\u00f4t\u00e9 client s\u2019ex\u00e9cutent toujours en utilisant les autorisations de l\u2019utilisateur. Par cons\u00e9quent, lorsqu\u2019un script c\u00f4t\u00e9 client n\u00e9cessite d\u2019acc\u00e9der \u00e0 des enregistrements externes, il doit utiliser un Suitelet interm\u00e9diaire pour r\u00e9cup\u00e9rer ou mettre \u00e0 jour les informations n\u00e9cessaires. Ce Suitelet peut \u00eatre configur\u00e9 pour \u00ab s\u2019ex\u00e9cuter en tant qu\u2019administrateur \u00bb, ce qui lui permet de contourner les autorisations de l\u2019utilisateur client.\n\nVous trouverez ci-dessous un exemple de code pour un Suitelet SuiteScript 2.1 qui reproduit la fonctionnalit\u00e9 de recherche de valeurs de champ, ainsi qu\u2019une fonction d\u2019aide c\u00f4t\u00e9 client correspondante.\n\n1.  **Suitelet de recherche de champ (SuiteScript 2.1)**\n\n    Ce Suitelet est con\u00e7u pour recevoir le type d\u2019enregistrement, l\u2019ID et le ou les champs en tant que param\u00e8tres via une requ\u00eate POST, effectuer une recherche \u00e0 l\u2019aide de `search.lookupFields`\n\net renvoyer le r\u00e9sultat sous forme de cha\u00eene JSON. Ce Suitelet doit \u00eatre d\u00e9ploy\u00e9 avec le param\u00e8tre \u00ab Ex\u00e9cuter en tant qu\u2019administrateur \u00bb activ\u00e9.\n\n```\njavascript\n\/**\n * @NApiVersion 2.1\n * @NScriptType Suitelet\n *\/\ndefine(['N\/search', 'N\/log', 'N\/runtime'], function(search, log, runtime) {\n\n    function onRequest(scriptContext) {\n        if (scriptContext.request.method === 'POST') {\n            var recordType = scriptContext.request.parameters.recordtype;\n            var recordId = scriptContext.request.parameters.recordid;\n            var recordFields = scriptContext.request.parameters.recordfield;\n\n            log.debug({ title: 'Suitelet Lookup - recordType', details: recordType });\n            log.debug({ title: 'Suitelet Lookup - recordId', details: recordId });\n            log.debug({ title: 'Suitelet Lookup - recordFields', details: recordFields });\n\n            if (recordType && recordId && recordFields) {\n                var columnsToLookup;\n                if (recordFields.indexOf(',') !== -1) {\n                    columnsToLookup = recordFields.split(',');\n                } else {\n                    columnsToLookup = recordFields;\n                }\n\n                try {\n                    var fieldValue = search.lookupFields({\n                        type: recordType,\n                        id: recordId,\n                        columns: columnsToLookup\n                    });\n\n                    var output = JSON.stringify(fieldValue);\n\n                    log.debug({ title: 'Suitelet Lookup - output', details: output });\n                    scriptContext.response.write(output);\n\n                } catch (e) {\n                    log.error({ title: 'Suitelet Lookup Error', details: e });\n                    scriptContext.response.write(\"ERROR: \" + e.message);\n                }\n\n            } else {\n                log.debug({ title: 'Suitelet Lookup - missing parameter', details: 'A missing parameter prevents from looking up value' });\n                scriptContext.response.write(\"0\");\n            }\n        }\n    }\n\n    return {\n        onRequest: onRequest\n    };\n});\n```\n\n2.  **Fonction d\u2019aide c\u00f4t\u00e9 client (SuiteScript 2.1)**\n\n    Cette fonction d\u2019aide, destin\u00e9e aux scripts c\u00f4t\u00e9 client, construit les param\u00e8tres de requ\u00eate et appelle le Suitelet d\u00e9ploy\u00e9. Elle analyse ensuite la r\u00e9ponse JSON renvoy\u00e9e par le Suitelet afin de restituer les valeurs des champs demand\u00e9s.\n\n```\njavascript\n\/**\n * @NApiVersion 2.1\n * @NModuleScope Public\n *\/\ndefine(['N\/url', 'N\/https'], function(url, https) {\n\n    function getValueViaSuitelet(recordType, recordId, recordField) {\n        var ssuValue = null;\n\n        var fieldsParam;\n        if (Array.isArray(recordField)) {\n            fieldsParam = recordField.join(\",\");\n        } else {\n            fieldsParam = recordField;\n        }\n\n        var params = {\n            recordtype: recordType,\n            recordid: recordId,\n            recordfield: fieldsParam\n        };\n\n        var suiteletURL = url.resolveScript({\n            scriptId: 'customscript_suitelet_lookup_id', \/\/ Replace with your Suitelet Script ID\n            deploymentId: 'customdeploy_suitelet_lookup_deploy', \/\/ Replace with your Suitelet Deployment ID\n            returnExternalUrl: false\n        });\n\n        try {\n            var response = https.post({\n                url: suiteletURL,\n                body: JSON.stringify(params),\n                headers: {\n                    'Content-Type': 'application\/json'\n                }\n            });\n\n            if (response.body !== \"0\" && response.body.indexOf(\"ERROR\") === -1) {\n                ssuValue = JSON.parse(response.body);\n            } else {\n                console.error(\"Suitelet returned an error or '0': \" + response.body);\n            }\n        } catch (e) {\n            console.error(\"Error calling Suitelet: \" + e.message);\n        }\n\n        return ssuValue;\n    }\n\n    return {\n        getValueViaSuitelet: getValueViaSuitelet\n    };\n});\n```\n\n\n\n**Remarques relatives \u00e0 la mise en \u0153uvre :**\n\n*   Remplacez `'customscript_suitelet_lookup_id'`\n\net `'customdeploy_suitelet_lookup_deploy'`\n\ndans la fonction d\u2019aide c\u00f4t\u00e9 client par l\u2019ID de script et l\u2019ID de d\u00e9ploiement r\u00e9els de votre Suitelet d\u00e9ploy\u00e9.\n*   Le Suitelet renvoie toujours un objet JSON, m\u00eame si un seul champ est demand\u00e9. La fonction c\u00f4t\u00e9 client `JSON.parse()`\n\ng\u00e8re cette conversion.","ga_source_author":"","ga_source_author_email":"","ga_date_original":"2017-08-21T11:11:53-04:00","ga_date_verified":"2026-07-05","ga_source_subject":"Suitelets for Client-Side Access","ga_ans_id":"ANS-0958","ga_publish_decision":"publish_with_edits","ga_staleness_risk":"high","ga_review_priority":"spot_check","ga_tier2_verdict":"partially_outdated","ga_tier2_concerns":"The sample code is written in SuiteScript 1.0, which is still supported but no longer the recommended version for new development; NetSuite strongly encourages using SuiteScript 2.x (specifically 2.1).; The SuiteScript 1.0 functions `nlapiLookupField()` and `nlapiLogExecution()` have been replaced by modular equivalents in SuiteScript 2.x (e.g., `search.lookupFields()` from the `N\/search` module and methods from the `N\/log` module).; The method for accessing request parameters (`request.getParameter()`) and the request method (`request.getMethod()`) in SuiteScript 1.0 have been superseded by properties of the `scriptContext.request` object in SuiteScript 2.x Suitelets (e.g., `scriptContext.request.parameters` and `scriptContext.request.method`).; The method for writing a response (`response.write()`) in SuiteScript 1.0 has been superseded by `scriptContext.response.write()` in SuiteScript 2.x Suitelets.","ga_final_category":"SuiteScript Development","footnotes":""},"ga_category":[108,23,108],"ga_audience":[10],"ga_difficulty":[94],"class_list":["post-2697","qa_entry","type-qa_entry","status-publish","hentry","ga_category-developpement-suitescript","ga_category-suitescript-development","ga_audience-developer-suitescript","ga_difficulty-avance"],"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":94,"label":"Avanc\u00e9"}]},"featured_image_src_large":[],"author_info":[],"comment_info":"","_links":{"self":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/2697","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\/2697\/revisions"}],"predecessor-version":[{"id":4617,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/2697\/revisions\/4617"}],"wp:attachment":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=2697"}],"wp:term":[{"taxonomy":"ga_category","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_category?post=2697"},{"taxonomy":"ga_audience","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_audience?post=2697"},{"taxonomy":"ga_difficulty","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_difficulty?post=2697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}