Écraser le fichier. Écraser le fichier de script des applications.

Ce n'est pas une question pour créer un nouveau fichier Apps Script. Cela ne m'aidera pas. Je dois mettre à jour un fichier Apps Script existant. Cette question est similaire à la création d'un nouveau fichier, mais ce n'est pas le même problème. La syntaxe d'une mise à jour et les exigences pour une mise à jour peuvent être suffisamment différentes de la création d'un nouveau fichier, que je ne peux pas obtenir de solution à partir de la réponse concernant la création d'un nouveau fichier. J'ai regardé une réponse pour créer un nouveau fichier, et cela n'a pas répondu à ma question.

J'ai essayé d'utiliser le service Advanced Drive pour mettre à jour un fichier Apps Script existant avec un autre fichier Apps Script.

function updateMyScript() {
  var targetFileID = 'File ID';

  var dataSource = {
    "files": [
      {
        "id":"739a57da-f77c-4e1a-96df-7d86ef227d62",
        "name":"Code",
        "type":"server_js",
        "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
      },
      {
        "id":"2c7e8b5a-dbc5-4cd2-80e9-77b6291b3167",
        "name":"index",
        "type":"html",
        "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    New message!!\n  \u003c/body\u003e\n\u003c/html\u003e"
      }
    ]
  };

  var filesResource = Drive.Files.get(targetFileID);
  var blob = Utilities.newBlob(JSON.stringify(dataSource), "application/vnd.google-apps.script+json");
  var whatRezult = Drive.Files.update(filesResource, targetFileID, blob, {"convert":"true"});

  Logger.log('whatRezult: ' + whatRezult);
};

Les propriétés id de l'objet dataSource sont les identifiants de chaque fichier .gs ou html spécifique à l'intérieur du projet. J'ai obtenu ces identifiants en téléchargeant le fichier de script d'applications "cible" sur JSON, puis en ouvrant le fichier JSON et en copiant les identifiants du fichier. Donc, je sais que ce sont corrects. Je voudrais un moyen de récupérer ces ID de fichier individuels du projet avec du code. Le message sur la création d'un fichier de script pour les applications nouveau n'explique pas comment obtenir les ID "sous" du fichier de projet. L'ID de fichier de projet n'est pas le même que chaque ID de fichier à l'intérieur du projet. Les propriétés name et type sont évidentes. Et il n'y a que deux types de fichiers qui, d'après l'exemple, ont des types server_js et "html". Il semble que le source pour les fichiers internes du fichier de projet Apps Script peut être une chaîne littérale. Ainsi, vous pouvez simplement taper ce que vous voulez que le contenu de remplacement soit.

Le target ID est explicite.

S'il existe un moyen de le faire avec le service Advanced Drive ou UrlFetchApp.fetch(), cela répondra à ma question. Je souhaite uniquement utiliser Apps Script. Donc, je ne cherche pas une solution écrite dans une autre langue ou exécutée en dehors d'Apps Script.

Avec le code ci-dessus, j'obtiens une erreur de l'avant-dernière ligne:

Drive.Files.update(filesResource, targetFileID, blob, {"convert":"true"});

L'erreur est:

L'application n'a pas l'étendue requise pour mettre à jour les scripts d'applications.

Donc, évidemment, il cherche un paramètre de portée à indiquer quelque part. Je suppose que cela entrerait dans le quatrième paramètre pour les options.

4
Alan Wells 26 déc. 2015 à 22:43

3 réponses

Meilleure réponse

Vous devez demander le scope spécial Drive-AppsScript:

https://www.googleapis.com/auth/drive.scripts

Puisque vous ne pouvez pas dire à Apps Script de vous demander cette étendue (il détermine automatiquement ses propres étendues en analysant votre code). Vous devez faire la danse oAuth vous-même (en utilisant la bibliothèque d'Eric par exemple). Mais comme vous ne pouvez pas non plus définir ce jeton que vous avez récupéré vous-même pour que le script l'utilise dans ses appels de service intégrés ou avancés (pas que je sache de toute façon), vous devrez également faire l'appel UrlFetch manuellement et passer votre jeton "personnalisé" dans l'en-tête (comme indiqué dans le "Créer un nouveau script".

L'appel UrlFetch à update est très similaire à celui de insert. Changez simplement la méthode en PUT et ajoutez l'ID du projet de script de l'application dans le chemin.

var url = "https://www.googleapis.com/upload/drive/v2/files/" + scriptID;
var requestBody = ...; //the same
var options = {
  "headers": {
     'Authorization': 'Bearer ' +  yourManuallyFetchedToken,
   }, 
  "contentType": "application/vnd.google-apps.script+json",
  "method" : "PUT", //changed here from POST to PUT
  "payload": JSON.stringify(requestBody)
}
4
Community 23 mai 2017 à 10:30

J'ai créé un référentiel GitHub d'un projet qui mettra à jour un fichier Apps Script (la cible) à partir d'un fichier Apps Script source. C'est totalement gratuit à copier et à utiliser.

Dépôt GitHub - apps-script-update

Consultez le fichier Lisez-moi dans le référentiel GitHub pour obtenir des instructions

Le code de GitHub utilise la nouvelle API Apps Script, qui est différente de la réponse d'origine.

3
Alan Wells 21 mars 2018 à 18:24

La nouvelle API Apps Script permet désormais de mettre à jour un projet Apps Script. Le projet mis à jour peut être lié à un document. (Sheet, Form, Doc) Ce code utilise l'API REST et effectue une requête PUT à partir du code Apps Script à l'aide de UrlFetchApp.fetch(url,options) Ce code est exécuté à partir d'un fichier Apps Script pour mettre à jour un autre fichier Apps Script.

L'API Apps Script doit être activée pour le fichier Apps Script exécutant le code. L'API Apps Script est activée dans la console Google Cloud. Dans l'éditeur de code, choisissez "Ressources" et "Projet Cloud Platform" Recherchez l'API Apps Script et activez-la.

function updateContent(scriptId,content,theAccessTkn) {
//try{
  var options,payload,response,url;

  if (!content) {
    //Error handling function
    return;
  }

  if (!theAccessTkn) {
    theAccessTkn = ScriptApp.getOAuthToken();
  }

  //https://developers.google.com/apps-script/api/reference/rest/v1/projects/updateContent
  url = "https://script.googleapis.com/v1/projects/" + scriptId + "/content";

  options = {
    "method" : "PUT",
    "muteHttpExceptions": true,
    "headers": {
      'Authorization': 'Bearer ' +  theAccessTkn
     },
    "contentType": "application/json",//If the content type is set then you can stringify the payload
    "payload": JSON.stringify(content)
  };

  response = UrlFetchApp.fetch(url,options);
  response = JSON.parse(response);//Must be parsed even though it shows as coming back as an object

  //Logger.log('typeof response: ' + typeof response)

  //Logger.log('response 29 in file GS_Update: ' + JSON.stringify(response).slice(0,45))

  return response;
//} catch(e) {
  //Logger.log(response)
//}
};

Vous devez utiliser les étendues appropriées pour que le code s'exécute sans erreur d'autorisation.

Les étendues peuvent être définies dans le fichier appsscript.json. Pour afficher le fichier appsscript.json, vous devez d'abord cliquer sur le menu Affichage et choisir l'élément de menu «Afficher le manifeste».

{
  "timeZone": "America/New_York",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.projects",
    "https://www.googleapis.com/auth/script.external_request"
  ],
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}

La première fois que l'API Apps Script est utilisée, la requête PUT peut ne pas fonctionner et renverra une erreur avec un lien vers la console Google Cloud. C'est pourquoi il est important d'afficher la réponse de retour Logger.log('typeof response: ' + typeof response) de l'instruction response = UrlFetchApp.fetch(url,options);.

0
Alan Wells 24 nov. 2018 à 16:35