{"id":10054,"date":"2013-11-02T06:57:37","date_gmt":"2013-11-02T05:57:37","guid":{"rendered":"http:\/\/flaven.fr\/?p=10054"},"modified":"2026-09-16T10:10:15","modified_gmt":"2026-09-16T08:10:15","slug":"google-saas-office-ecrire-des-scripts-pour-la-suite-de-google-docs","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2013\/11\/google-saas-office-ecrire-des-scripts-pour-la-suite-de-google-docs\/","title":{"rendered":"Google, SaaS, Office &#8211; Ecrire des scripts pour la suite de google docs"},"content":{"rendered":"\n<p>  <!-- complotiste et parano #cloud, #privacy, #NSA, #google,  --><br \/>\n  <!-- laconique #cloud, #saas, #agile, #projectmanagement, #multilingue   --><\/p>\n<p><!--  Google, SaaS, Office - Ecrire des scripts pour la suite de google docs --><br \/>\n\t<!--  Google Spreadsheets, SaaS, Cloud, Google Apps, Script, JavaScript, scripting, language --><\/p>\n<p>\tDans la plupart des projets d\u00e9sormais, dans le domaine du web et ailleurs, vous \u00eates amen\u00e9(e) \u00e0 collaborer, donc \u00e0 partager des documents, des informations. C&#8217;est la raison d&#8217;\u00eatre de nombreux outils de collaboration. On peut citer les plus connus, <code>Redmine<\/code> pour g\u00e9rer des tickets et tracer les demandes d&#8217;\u00e9volution ou bien de <code>Basecamp<\/code>, qui est un peu le &#8220;couteau suisse&#8221; de la gestion de projets. Toutefois, dans de nombreux cas, lorsque le projet est de taille modeste en volume comme en dur\u00e9e (peu d&#8217;intervenants, quelques semaines d&#8217;it\u00e9rations&#8230;etc.), ces outils se r\u00e9v\u00e8lent quelques peu disproportionn\u00e9s et peuvent finir par cr\u00e9er plus de &#8220;bruit&#8221; que de clart\u00e9.<\/p>\n<p>\tParfois, un simple tableur suffit, encore faut-il pouvoir le partager et\/ou le rendre disponible pour tous. C&#8217;est l\u00e0 o\u00f9 le tableur de Google docs, le <code>Google Spreadsheets<\/code> rentre dans la danse. Un document ou plusieurs document <code>Google Spreadsheets<\/code> peuvent amplement suffire \u00e0 piloter un projet afin de constituer toute type de document n\u00e9cessaire \u00e0 la conduite de projet : plan de recette, calendrier, diagramme de Gantt&#8230;<br \/>\n<b>Un b\u00e9mol n\u00e9anmoins, rappelez-vous que vous \u00eates sur le Cloud et que c&#8217;est un document partag\u00e9. Bien que cela sonne comme une \u00e9vidence, cette double caract\u00e9ristique commande de rester prudent dans l&#8217;utilisation d&#8217;un tableur <code>Google Spreadsheets<\/code>.<\/b><\/p>\n<ul>\n<li>Il faut rester vigilant sur le volume de donn\u00e9es qui va \u00eatre trait\u00e9 par votre tableur sinon le document sera indigeste donc inutilisable car trop lent.<\/li>\n<li>Il faut utiliser avec parcimonie les fonctions additionnelles dont vous souhaiteriez tirer profit (tris crois\u00e9s, filtres automatiques&#8230; etc.) car ce qu&#8217;il est possible de faire avec un tableur en local n&#8217;est pas forcement reproductible sur un document en ligne.<\/li>\n<\/ul>\n<p><i>On ne parle m\u00eame pas de la s\u00e9curit\u00e9 \u00e9ventuelle de vos documents. En effet, tout ce qui part en ligne peut-\u00eatre potentiellement, lu, modifi\u00e9, observ\u00e9&#8230; hack\u00e9 en quelque sorte. Il est vrai quand on est sur un petit projet, ce n&#8217;est pas la pr\u00e9occupation principale et puis de toutes les fa\u00e7ons la NSA * \u00e9coute tout le monde alors autant leur donner des billes !<\/i><\/p>\n<p><i>* Source :<br \/>\n  <a href=\"http:\/\/www.lemonde.fr\/technologies\/article\/2013\/10\/30\/comment-la-nsa-infiltre-secretement-les-serveurs-de-google-et-yahoo_3505678_651865.html\" target=\"_blank\">Comment la NSA infiltre secr\u00e8tement les serveurs de Google et Yahoo!<\/a><br \/>\n<\/i><br \/>\n<i><a href=\"http:\/\/www.washingtonpost.com\/world\/national-security\/nsa-infiltrates-links-to-yahoo-google-data-centers-worldwide-snowden-documents-say\/2013\/10\/30\/e51d661e-4166-11e3-8b74-d89d714ca4dd_story.html\" target=\"_blank\">NSA infiltrates links to Yahoo, Google data centers worldwide<\/a><\/i><\/p>\n<p><b>A l&#8217;aide de diff\u00e9rents scripts, on va donc voir comment am\u00e9liorer la pertinence des informations saisies dans un tableur Google pour partager la meilleure information possible.<\/b><\/p>\n<p><H4>La cuisine au GAS ou GAS for SaaS<\/H4><br \/>\nPour faire des scripts dans un tableur <code>Google Spreadsheets<\/code>, il faut se familiariser avec le GAS, sorte de d\u00e9riv\u00e9 du JavaScript. C&#8217;est le langage de programmation de Google Apps Script.<\/p>\n<blockquote><p>Google Apps Script is a JavaScript cloud scripting language that provides easy ways to automate tasks across Google products and third party services.<\/p><\/blockquote>\n<p>Le GAS (Google Apps Script) permet donc d&#8217;augmenter les &#8220;capacit\u00e9s&#8221; de votre tableur et peut-\u00eatre utilis\u00e9 dans diff\u00e9rents situations comme pour :  <\/p>\n<ul>\n<li>R\u00e9diger des fonctions utilisateur pour Google Spreadsheets.<\/li>\n<li>R\u00e9diger des applications de type simple &#8220;macro&#8221;.<\/li>\n<li>D\u00e9velopper des applications bas\u00e9es sur tableur.<\/li>\n<li>Int\u00e9grer les autres produits et services Google.<\/li>\n<\/ul>\n\n\t<div class=\"wpb_codesnippet_element 1\/1\">\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<div class=\"heading-wrap\"><h3 class=\"wpb_heading wpb_codesnippet_heading\"><span>Limitations \u00e0 l'usage des tableurs Google<\/span><\/h3><\/div>\n\t\t\t<code><br \/>\n  Attention, selon Google, il existe des limitations mais Google est assez g\u00e9n\u00e9reux.<\/p>\n<p>  <em>\u201cUne feuille de calcul Google ne peut pas d\u00e9passer en taille, les 400 000 cellules et chaque feuille est limit\u00e9e \u00e0 256 colonnes.\u201d<\/em><\/p>\n<p>  <\/code>\n\t\t<\/div>\n\t<\/div>\n<p>  <b>On ne va pas ergoter sur la nature du GAS, javascript ou pas javascript. Il est certain que la filiation avec le javascript est \u00e9vidente. Dans cet article, on se focalise exclusivement en quoi le scripting dans un tableur google produit et peut vous \u00eatre utile.<\/b> <\/p>\n<h4>Notre cas d&#8217;\u00e9cole<\/h4>\n<p>  On va voir comment si vous pilotez un projet digital multilingue, vous allez pouvoir \u00e0 l&#8217;aide d&#8217;un tableur Google constituer une base de traduction. Chacune des phrases sera \u00e0 traduire du fran\u00e7ais vers les 4 langues n\u00e9cessaires \u00e0 votre projet (Anglais, Espagnol, Allemand, Arabe). Pour chaque phrase, il existe une colonne de saisie pour le traducteur et un mod\u00e8le de traduction issu automatiquement de l&#8217;API google translate. <\/p>\n<p>  Ce tableur sera ensuite publi\u00e9 sur le web en format CSV et converti dynamiquement en JSON \u00e0 l&#8217;aide de PHP de sorte que vous puissiez par exemple l&#8217;int\u00e9grer directement dans des fichiers de traduction de votre site web ou de votre application web.<\/p>\n<blockquote><p>\n    La totalit\u00e9 des documents pr\u00e9sent\u00e9s dans cet article sont \u00e0 t\u00e9l\u00e9charger dans ce fichier : <a href=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc.zip\" target=\"_blank\">create_script_for_google_doc.zip<\/a>\n  <\/p><\/blockquote>\n<p>  <b>Le tableur google de traduction  et comment importer le scrip <code>.gs<\/code><\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_script_1.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<b>L&#8217;\u00e9diteur de script<\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_script_2.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<b>Le script <code>TranslateSheet.gs<\/code> pour traduire \u00e0 l&#8217;aide de Google Translate nos phrases en fran\u00e7ais dans 4 langues (anglais, espagnol, allemand, arabe). Le script est volontairement tr\u00e8s simple pour pouvoir \u00eatre facilement changer sans connaissance particuli\u00e8re de d\u00e9veloppement.<\/b><\/p>\n<pre lang=\"javascript\">\r\n  \t \r\n  \t \r\n\r\n      function TranslatorSpreadsheet() {\r\n\r\n      \t\/* VALUES *\/\r\n      \tvar word_2 = 'Voir le mot-cl\u00e9';\r\n      \tvar word_3 = 'Afficher la cat\u00e9gorie';\r\n      \tvar word_4 = 'Mettre \u00e0 jour le mot-cl\u00e9';\r\n      \tvar word_5 = 'Mettre \u00e0 jour la cat\u00e9gorie';\r\n      \tvar word_6 = 'Ajouter un nouveau mot-cl\u00e9';\r\n      \tvar word_7 = 'Ajouter une nouvelle cat\u00e9gorie';\r\n      \tvar word_8 = 'Nom du nouveau mot-cl\u00e9';\r\n      \tvar word_9 = 'Nom de la nouvelle cat\u00e9gorie';\r\n      \tvar word_10 = 'S\u00e9parez les mots-cl\u00e9s par des virgules';\r\n      \tvar word_11 = 'Ajouter ou retirer des mots-cl\u00e9s';\r\n      \tvar word_12 = 'Choisir parmi les mots-cl\u00e9s les plus utilis\u00e9s';\r\n      \tvar word_13 = 'Voir la page';\r\n      \tvar word_14 = 'Chercher dans les articles';\r\n      \tvar word_15 = 'Chercher dans les pages';\r\n      \tvar word_16 = 'Aucun article trouv\u00e9.';\r\n      \tvar word_17 = 'Aucune page trouv\u00e9e.';\r\n      \tvar word_18 = 'Aucun article trouv\u00e9 dans la corbeille.';\r\n      \tvar word_19 = 'Aucune page trouv\u00e9e dans la corbeille.';\r\n\r\n\r\n      \t\/\/ Get the active Sheet\r\n      \tsheet = SpreadsheetApp.getActiveSheet();\r\n\r\n      \t\/\/ Get the source of the date in order to translate\r\n      \tsheet.getRange('A2').setValue(word_2);\r\n      \tsheet.getRange('A3').setValue(word_3);\r\n      \tsheet.getRange('A4').setValue(word_4);\r\n      \tsheet.getRange('A5').setValue(word_5);\r\n      \tsheet.getRange('A6').setValue(word_6);\r\n      \tsheet.getRange('A7').setValue(word_7);\r\n      \tsheet.getRange('A8').setValue(word_8);\r\n      \tsheet.getRange('A9').setValue(word_9);\r\n      \tsheet.getRange('A10').setValue(word_10);\r\n      \tsheet.getRange('A11').setValue(word_11);\r\n      \tsheet.getRange('A12').setValue(word_12);\r\n      \tsheet.getRange('A13').setValue(word_13);\r\n      \tsheet.getRange('A14').setValue(word_14);\r\n      \tsheet.getRange('A15').setValue(word_15);\r\n      \tsheet.getRange('A16').setValue(word_16);\r\n      \tsheet.getRange('A17').setValue(word_17);\r\n      \tsheet.getRange('A18').setValue(word_18);\r\n      \tsheet.getRange('A19').setValue(word_19);\r\n\r\n\r\n      \t\/\/ Using the LanguageApp write to cell\r\n        sheet.getRange('B2').setValue(LanguageApp.translate(word_2, 'fr', 'en'));\r\n      \tsheet.getRange('D2').setValue(LanguageApp.translate(word_2, 'fr', 'es'));\r\n      \tsheet.getRange('F2').setValue(LanguageApp.translate(word_2, 'fr', 'de'));\r\n      \tsheet.getRange('H2').setValue(LanguageApp.translate(word_2, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B3').setValue(LanguageApp.translate(word_3, 'fr', 'en'));\r\n      \tsheet.getRange('D3').setValue(LanguageApp.translate(word_3, 'fr', 'es'));\r\n      \tsheet.getRange('F3').setValue(LanguageApp.translate(word_3, 'fr', 'de'));\r\n      \tsheet.getRange('H3').setValue(LanguageApp.translate(word_3, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B4').setValue(LanguageApp.translate(word_4, 'fr', 'en'));\r\n      \tsheet.getRange('D4').setValue(LanguageApp.translate(word_4, 'fr', 'es'));\r\n      \tsheet.getRange('F4').setValue(LanguageApp.translate(word_4, 'fr', 'de'));\r\n      \tsheet.getRange('H4').setValue(LanguageApp.translate(word_4, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B5').setValue(LanguageApp.translate(word_5, 'fr', 'en'));\r\n      \tsheet.getRange('D5').setValue(LanguageApp.translate(word_5, 'fr', 'es'));\r\n      \tsheet.getRange('F5').setValue(LanguageApp.translate(word_5, 'fr', 'de'));\r\n      \tsheet.getRange('H5').setValue(LanguageApp.translate(word_5, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B6').setValue(LanguageApp.translate(word_6, 'fr', 'en'));\r\n      \tsheet.getRange('D6').setValue(LanguageApp.translate(word_6, 'fr', 'es'));\r\n      \tsheet.getRange('F6').setValue(LanguageApp.translate(word_6, 'fr', 'de'));\r\n      \tsheet.getRange('H6').setValue(LanguageApp.translate(word_6, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B7').setValue(LanguageApp.translate(word_7, 'fr', 'en'));\r\n      \tsheet.getRange('D7').setValue(LanguageApp.translate(word_7, 'fr', 'es'));\r\n      \tsheet.getRange('F7').setValue(LanguageApp.translate(word_7, 'fr', 'de'));\r\n      \tsheet.getRange('H7').setValue(LanguageApp.translate(word_7, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B8').setValue(LanguageApp.translate(word_8, 'fr', 'en'));\r\n      \tsheet.getRange('D8').setValue(LanguageApp.translate(word_8, 'fr', 'es'));\r\n      \tsheet.getRange('F8').setValue(LanguageApp.translate(word_8, 'fr', 'de'));\r\n      \tsheet.getRange('H8').setValue(LanguageApp.translate(word_8, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B9').setValue(LanguageApp.translate(word_9, 'fr', 'en'));\r\n      \tsheet.getRange('D9').setValue(LanguageApp.translate(word_9, 'fr', 'es'));\r\n      \tsheet.getRange('F9').setValue(LanguageApp.translate(word_9, 'fr', 'de'));\r\n      \tsheet.getRange('H9').setValue(LanguageApp.translate(word_9, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B10').setValue(LanguageApp.translate(word_10, 'fr', 'en'));\r\n      \tsheet.getRange('D10').setValue(LanguageApp.translate(word_10, 'fr', 'es'));\r\n      \tsheet.getRange('F10').setValue(LanguageApp.translate(word_10, 'fr', 'de'));\r\n      \tsheet.getRange('H10').setValue(LanguageApp.translate(word_10, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B11').setValue(LanguageApp.translate(word_11, 'fr', 'en'));\r\n      \tsheet.getRange('D11').setValue(LanguageApp.translate(word_11, 'fr', 'es'));\r\n      \tsheet.getRange('F11').setValue(LanguageApp.translate(word_11, 'fr', 'de'));\r\n      \tsheet.getRange('H11').setValue(LanguageApp.translate(word_11, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B12').setValue(LanguageApp.translate(word_12, 'fr', 'en'));\r\n      \tsheet.getRange('D12').setValue(LanguageApp.translate(word_12, 'fr', 'es'));\r\n      \tsheet.getRange('F12').setValue(LanguageApp.translate(word_12, 'fr', 'de'));\r\n      \tsheet.getRange('H12').setValue(LanguageApp.translate(word_12, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B13').setValue(LanguageApp.translate(word_13, 'fr', 'en'));\r\n      \tsheet.getRange('D13').setValue(LanguageApp.translate(word_13, 'fr', 'es'));\r\n      \tsheet.getRange('F13').setValue(LanguageApp.translate(word_13, 'fr', 'de'));\r\n      \tsheet.getRange('H13').setValue(LanguageApp.translate(word_13, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B14').setValue(LanguageApp.translate(word_14, 'fr', 'en'));\r\n      \tsheet.getRange('D14').setValue(LanguageApp.translate(word_14, 'fr', 'es'));\r\n      \tsheet.getRange('F14').setValue(LanguageApp.translate(word_14, 'fr', 'de'));\r\n      \tsheet.getRange('H14').setValue(LanguageApp.translate(word_14, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B15').setValue(LanguageApp.translate(word_15, 'fr', 'en'));\r\n      \tsheet.getRange('D15').setValue(LanguageApp.translate(word_15, 'fr', 'es'));\r\n      \tsheet.getRange('F15').setValue(LanguageApp.translate(word_15, 'fr', 'de'));\r\n      \tsheet.getRange('H15').setValue(LanguageApp.translate(word_15, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B16').setValue(LanguageApp.translate(word_16, 'fr', 'en'));\r\n      \tsheet.getRange('D16').setValue(LanguageApp.translate(word_16, 'fr', 'es'));\r\n      \tsheet.getRange('F16').setValue(LanguageApp.translate(word_16, 'fr', 'de'));\r\n      \tsheet.getRange('H16').setValue(LanguageApp.translate(word_16, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B17').setValue(LanguageApp.translate(word_17, 'fr', 'en'));\r\n      \tsheet.getRange('D17').setValue(LanguageApp.translate(word_17, 'fr', 'es'));\r\n      \tsheet.getRange('F17').setValue(LanguageApp.translate(word_17, 'fr', 'de'));\r\n      \tsheet.getRange('H17').setValue(LanguageApp.translate(word_17, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B18').setValue(LanguageApp.translate(word_18, 'fr', 'en'));\r\n      \tsheet.getRange('D18').setValue(LanguageApp.translate(word_18, 'fr', 'es'));\r\n      \tsheet.getRange('F18').setValue(LanguageApp.translate(word_18, 'fr', 'de'));\r\n      \tsheet.getRange('H18').setValue(LanguageApp.translate(word_18, 'fr', 'ar'));\r\n\r\n      \tsheet.getRange('B19').setValue(LanguageApp.translate(word_19, 'fr', 'en'));\r\n      \tsheet.getRange('D19').setValue(LanguageApp.translate(word_19, 'fr', 'es'));\r\n      \tsheet.getRange('F19').setValue(LanguageApp.translate(word_19, 'fr', 'de'));\r\n      \tsheet.getRange('H19').setValue(LanguageApp.translate(word_19, 'fr', 'ar'));\r\n\r\n\r\n\r\n\r\n       }\/\/ EOF\r\n\r\n  \t<\/pre>\n<p>  \t<b>Publier sur le web le tableur au format <code>.csv<\/code><\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_5_publish_csv.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<b>La transformation du <code>.csv<\/code> en <code>.json<\/code> \u00e0 l&#8217;aide de PHP<\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_6_json_change_1.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<b>Le script PHP de conversion<\/b><br \/>\n  \t<i>Source : <a href=\"http:\/\/www.ravelrumba.com\/blog\/json-google-spreadsheets\/\" target=\"_blank\">http:\/\/www.ravelrumba.com\/blog\/json-google-spreadsheets\/<\/a><\/i><\/p>\n<pre lang=\"php\">\r\n  \t  &lt;?php\r\n      header('Content-type: application\/json');\r\n\r\n      \/\/ Set your CSV feed\r\n      \/\/ $feed = 'https:\/\/docs.google.com\/spreadsheet\/pub?hl=en_US&amp;hl=en_US&amp;key=0Akse3y5kCOR8dEh6cWRYWDVlWmN0TEdfRkZ3dkkzdGc&amp;single=true&amp;gid=0&amp;output=csv';\r\n\r\n      \/\/ Mettre l'adresse de votre feed CSV &agrave; la place...\r\n      $feed = 'https:\/\/docs.google.com\/spreadsheet\/pub?key=0An_r4U36nZbxdElZc3RTamdxWG42N2VBVGJ5dE9xVWc&amp;single=true&amp;gid=0&amp;output=csv';\r\n\r\n      \/\/ Arrays we'll use later\r\n      $keys = array();\r\n      $newArray = array();\r\n\r\n      \/\/ Function to convert CSV into associative array\r\n      function csvToArray($file, $delimiter) { \r\n        if (($handle = fopen($file, 'r')) !== FALSE) { \r\n          $i = 0; \r\n          while (($lineArray = fgetcsv($handle, 4000, $delimiter, '\"')) !== FALSE) { \r\n            for ($j = 0; $j &lt; count($lineArray); $j++) { \r\n              $arr[$i][$j] = $lineArray[$j]; \r\n            } \r\n            $i++; \r\n          } \r\n          fclose($handle); \r\n        } \r\n        return $arr; \r\n      } \r\n\r\n      \/\/ Do it\r\n      $data = csvToArray($feed, ',');\r\n\r\n      \/\/ Set number of elements (minus 1 because we shift off the first row)\r\n      $count = count($data) - 1;\r\n\r\n      \/\/Use first row for names  \r\n      $labels = array_shift($data);  \r\n\r\n      foreach ($labels as $label) {\r\n        $keys[] = $label;\r\n      }\r\n\r\n      \/\/ Add Ids, just in case we want them later\r\n      $keys[] = 'id';\r\n\r\n      for ($i = 0; $i &lt; $count; $i++) {\r\n        $data[$i][] = $i;\r\n      }\r\n\r\n      \/\/ Bring it all together\r\n      for ($j = 0; $j &lt; $count; $j++) {\r\n        $d = array_combine($keys, $data[$j]);\r\n        $newArray[$j] = $d;\r\n      }\r\n\r\n      \/\/ Print it out as JSON\r\n      echo json_encode($newArray);\r\n\r\n      ?&gt;\r\n  \t \r\n  \t<\/pre>\n<p>  \t<b>Notre JSON plus facilement int\u00e9grable dans le d\u00e9veloppement d&#8217;un site web, mobile, d&#8217;une webapp ou d&#8217;un SaaS.<\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_6_json_result_1.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_6_json_result_zoom_1.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_6_json_change_2.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>  \t<b>Toutes les modifications apport\u00e9es au tableur se r\u00e9percutent sur le flux JSON. Le flux est donc remis \u00e0 jour constamment si vous cochez dans le mode de publication &#8220;Republier automatiquement apr\u00e8s chaque modification&#8221;<\/b><br \/>\n  \t<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_6_spread_change_1_2.jpg\" alt=\"oogle, SaaS, Office - Ecrire des scripts pour la suite de google docs\" width=\"500\" height=\"313\" \/><\/p>\n<p>    <b>Conclusion : Sans vouloir \u00eatre trop enthousiaste, ce POC (Proof Of Concept) offre des perspectives en mati\u00e8re de collaboration jusqu&#8217;\u00e0 pr\u00e9sent inimaginables. C&#8217;est sans doute pour cela que l&#8217;on nous bassine avec la r\u00e9volution du Cloud computing et du SaaS mais c&#8217;est un fait ! Si de telles services sont d\u00e9sormais disponibles, cela change irr\u00e9m\u00e9diablement nos conditions de travail et de partage de l&#8217;information. En clair, ces outils sont bien le pendant technologique de notre monde globalis\u00e9, d\u00e9sinterm\u00e9di\u00e9, digitalis\u00e9 et dans une vision moins rose ultra inf\u00e9od\u00e9 \u00e0 des g\u00e9ants tel que Google mais ne faut-il pas aller dans le sens de l&#8217;Histoire ?<\/b><\/p>\n<h4>Quelques scripts en compl\u00e9ment<\/h4>\n<p>  Il existe toute une palette de scripts \u00e0 votre disposition sur Google, en voici quelques-uns notamment un script pour annoter dans 2 colonnes, la date et la personne qui a pour la derni\u00e8re fois modifier la ligne d&#8217;un tableur. Pratique. <\/p>\n<p>  <b>Un script utile pour voir l&#8217;heure et le nom de la derni\u00e8re personne qui modifie un tableur<\/b><\/p>\n<pre lang=\"javascript\" escaped=\"true\" line=\"1\" highlight=\"3\">\r\n    \/\/ update a cell with last modified time.  \r\n    \/\/ Edit this script to your taste, e.g. a different cell, different date formatting (see javascript date)\r\n    \/\/ You could also use d.toString() to have whatever default date formatting your browser\/system provides.\r\n    function onEdit() {\r\n      var d = new Date();\r\n      var h = d.getHours();\r\n      var min = d.getMinutes();\r\n      var sec = d.getSeconds();\r\n      var h_str = h;\r\n      var min_str = min;\r\n      var sec_str = sec;\r\n      var day = d.getDate();\r\n      var day_str = day;\r\n      var month = d.getMonth()+1;\r\n      var month_str = month;\r\n      var year = d.getFullYear();\r\n\r\n      \/\/ format time nicely\r\n      if (h &lt; 10) \r\n        h_str = '0' + h;\r\n      if (min &lt; 10) \r\n        min_str = '0' + min;\r\n      if (sec &lt; 10) \r\n        sec_str = '0' + sec;\r\n      if (day &lt; 10) \r\n        day_str = '0' + day;\r\n      if (month &lt; 10) \r\n        month_str = '0' + month;\r\n\r\n      var date_str = year + '\/'+ month_str + '\/' + day_str;\r\n\r\n      \/\/ create the formatted time string\r\n      var time_str = h_str + ':' + min_str + ':' + sec_str;\r\n\r\n      var user = Session.getEffectiveUser().getEmail();\r\n\r\n      \/\/ create the message (change this to whatever wording you prefer)\r\n      \/\/ note also that rather than all the above, you could just use d.toString() \r\n      \/\/ I didn't because I didn't want it printing the timezone.\r\n      var s = date_str + ' ' + time_str;\r\n\r\n      \/\/ change the range from \"A1\" to whatever cell you wish to update\r\n\r\n      var activeRow = SpreadsheetApp.getActiveSheet().getActiveRange().getRowIndex();\r\n\r\n      \/\/ This were you fix the column for instance in our example it is Column L and Column M\r\n      if (activeRow &gt; 1) {\r\n        SpreadsheetApp.getActiveSheet().getRange(\"L\"+activeRow).setValue(s);\r\n        SpreadsheetApp.getActiveSheet().getRange(\"M\"+activeRow).setValue(user);\r\n      }\r\n    }\r\n  <\/pre>\n<p>  <b>Une script pour le word de google docs<\/b><\/p>\n<pre lang=\"javascript\">\r\n\r\n   function createAndSendDocument() {\r\n     \/\/ Create a new document with the title 'Hello World'\r\n     var doc = DocumentApp.create('Hello World');\r\n\r\n     \/\/ Add a paragraph to the document\r\n     doc.appendParagraph('This document was created by my first Google Apps Script.');\r\n\r\n     \/\/ Save and close the document\r\n     doc.saveAndClose();\r\n\r\n     \/\/ Get the URL of the document\r\n     var url = doc.getUrl();\r\n\r\n     \/\/ Get the email address of the active user - that's you\r\n     var emailAddress = Session.getActiveUser().getEmail();\r\n\r\n     \/\/ Send yourself an email with a link to the document\r\n     GmailApp.sendEmail(emailAddress,\r\n                        'Hello from my first Google Apps Script!',\r\n                        'Here is a link to a document created by my ' +\r\n                        'first Google Apps Script: ' + url);\r\n   }\r\n   <\/pre>\n<p>   <i>Source : <a href=\"https:\/\/developers.google.com\/apps-script\/your_first_script\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/your_first_script<\/a><\/i><\/p>\n<p><b>Un autre script&#8230;.<\/b> <\/p>\n<pre lang=\"javascript\">\r\n\/\/ Declare a variable called 'user_name' and assign it to the user name of the the Google account user.\r\n  function displayUsername() {\r\n      \/\/ var user_name = Session.getActiveUser().getUsername();\r\n       var user_name =\"Bruno\";\r\n      Browser.msgBox(\"Hello, \" + user_name);\r\n  }\r\n<\/pre>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Getting JSON out of Google Spreadsheets  (excellent)<br \/><a href=\"http:\/\/www.ravelrumba.com\/blog\/json-google-spreadsheets\/\" target=\"_blank\">http:\/\/www.ravelrumba.com\/blog\/json-google-spreadsheets\/<\/a><\/li>\n<li>A Google Spreadsheet JSON Export script<br \/><a href=\"https:\/\/gist.github.com\/pamelafox\/1878143\" target=\"_blank\">https:\/\/gist.github.com\/pamelafox\/1878143<\/a><\/li>\n<li>Download customized json from google drive spreadsheet<br \/><a href=\"http:\/\/www.arinkverma.in\/2013\/03\/download-customized-structured-json.html\" target=\"_blank\">http:\/\/www.arinkverma.in\/2013\/03\/download-customized-structured-json.html<\/a><\/li>\n<li>Quickstart: Managing Responses for Google Forms<br \/><a href=\"https:\/\/developers.google.com\/apps-script\/quickstart\/forms\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/quickstart\/forms<\/a><\/li>\n<li>Tutorials for Scripts Spreadsheet<br \/><a href=\"https:\/\/developers.google.com\/apps-script\/articles\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/guides\/sheets<\/a><\/li>\n<li>Custom Functions in Spreadsheets<br \/><a href=\"https:\/\/developers.google.com\/apps-script\/execution_custom_functions\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/execution_custom_functions<\/a><\/li>\n<li>Custom Menus and User Interfaces in Google Sheets<br \/><a href=\"https:\/\/developers.google.com\/apps-script\/guides\/sheets#menus\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/guides\/sheets#menus<\/a><\/li>\n<li>Add formulas to a spreadsheet<br \/><a href=\"https:\/\/support.google.com\/drive\/answer\/140893?hl=en&#038;topic=20433&#038;ctx=topic\" target=\"_blank\">https:\/\/support.google.com\/drive\/answer\/140893?hl=en&#038;topic=20433&#038;ctx=topic<\/a><\/li>\n<li>Google Spreadsheet Programming (nice)<br \/><a href=\"https:\/\/leanpub.com\/googlespreadsheetprogramming\" target=\"_blank\">https:\/\/leanpub.com\/googlespreadsheetprogramming<\/a><\/li>\n<li>Class DialogBox<br \/><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/ui\/dialog-box\" target=\"_blank\">https:\/\/developers.google.com\/apps-script\/reference\/ui\/dialog-box<\/a><\/li>\n<li>Getting Started With Google Apps Script<br \/><a href=\"http:\/\/gotofritz.net\/blog\/tutorials\/getting-started-part-1\/\" target=\"_blank\">http:\/\/gotofritz.net\/blog\/tutorials\/getting-started-part-1\/<\/a><\/li>\n<li>Google App Script<br \/><a href=\"http:\/\/wiki.glitchdata.com\/index.php?title=Google_App_Script\" target=\"_blank\">http:\/\/wiki.glitchdata.com\/index.php?title=Google_App_Script<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dans la plupart des projets d\u00e9sormais, dans le domaine du web et ailleurs, vous \u00eates amen\u00e9(e) \u00e0 collaborer, donc \u00e0 partager des documents, des informations.&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2013\/11\/google-saas-office-ecrire-des-scripts-pour-la-suite-de-google-docs\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">Google, SaaS, Office &#8211; Ecrire des scripts pour la suite de google docs<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10068,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Ecrire des scripts pour Google Docs optimise la collaboration sur des projets modestes. Utilisez des outils sp\u00e9cifiques pour des r\u00e9sultats pr\u00e9cis.","bf_ai_og_title":"Scripts Google Docs pour SaaS","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3439,3440,3442,3444,3446,3447,3448,3450,3451],"tags":[2200,271,1922,226,1924,3507,2242,392,1923],"class_list":["post-10054","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apis-integration","category-cloud-infrastructure","category-mobile-devices","category-programming-databases","category-social-media-community","category-technology-trends","category-tools-productivity","category-ux-product-design","category-web-design-front-end","tag-cloud","tag-google-apps","tag-google-spreadsheets","tag-javascript","tag-language","tag-redmine","tag-saas","tag-script","tag-scripting"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2Ca","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/11\/create_script_for_google_doc_bf_n.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10054"}],"version-history":[{"count":10,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10054\/revisions"}],"predecessor-version":[{"id":10085,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10054\/revisions\/10085"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10068"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}