Google Apps Script API-Berechtigungen für DriveApp.getFileById

Oct 07 2020

Ich habe ein Google Cloud Platform Project (GCP), das fast alle Skripte / Funktionen direkt ausführt, aber ein paar über eine API. Auf alles ist nur intern für die G Suite-Domäne zugegriffen, und der OAuth-Zustimmungsbildschirm Anwendungstyp ist "Intern".

Ich habe ein Skript, das nicht über eine API aufgerufen wird, sondern alle x Minuten direkt auf einem Timer. Es führt eine

DriveApp.getFileByID(pictureID)

Das funktioniert super! Keine Probleme.

Ich habe auch ein anderes Skript im selben GCP-Projekt, das nicht von einem Timer ausgelöst, sondern über eine API aufgerufen wird. Hier ist die Codezeile, die es aufruft (nicht wirklich wichtig):

var result = UrlFetchApp.fetch(url, options);

Das API-Skript läuft großartig! Bis es zu folgenden Zeilen kommt:

      try { var file = DriveApp.getFileById(pictureID); }
      catch (e) {
        Logger.log('e = ' + JSON.stringify(e));
        return;
      }

Das Ergebnis des Protokolls ist

e = {"name":"Exception"}

Ich habe überprüft, ob die Bild-ID dieselbe ist wie im Nicht-API-Skript, das funktioniert. Ich mache einen "Versuch" in diesem API-ausgeführten Skript, um sicherzustellen, dass die Software Zugriff auf die Datei hat, nicht um tatsächlich darauf zuzugreifen.

Ich bin mir ziemlich sicher, dass dies ein Autorisierungsproblem ist. Ich benutze GCP erst seit einiger Zeit, habe einige Erfahrungen mit Berechtigungen, aber nicht viel.

Hier einige Details zu den Berechtigungen ...

Die Skripts des Projekts Projekteigenschaften (Datei- / Projekteigenschaften) zeigen, dass die folgenden OAuth-Bereiche erforderlich sind:

Laut Googles Dokumentation unter https://developers.google.com/apps-script/reference/drive/drive-app#getfilebyidid,

Scripts that use this method require authorization with one or more of the following scopes: 

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

Hier sind die Bereiche, die ich jetzt auf dem GCP Oauth-Zustimmungsbildschirm definiert habe:

Wie Sie sehen können, habe ich drive, drive.readonly und drive.file hinzugefügt (was nicht wirklich benötigt zu werden scheint).

Darüber hinaus wird diese bestimmte Bilddatei im Google Drive des Eigentümers des GCP-Projekts, der Skripte und des Administrators der obersten Ebene der G Suite-Domäne gespeichert. Dies ist nicht immer der Fall, da Nutzer Bilder von ihrem eigenen Google Drive an diesen Software- / GCP-Besitzer weitergeben. Ich habe jedoch das Gefühl, dass das von einem Timer ausgelöste Skript bereits jetzt mit diesen vom Benutzer freigegebenen Dateien funktioniert, nicht jedoch mit dem über eine API aufgerufenen Skript.

Ich bin mir ziemlich sicher, dass dies ein Auth-Problem ist, aber irgendwo fehlt mir etwas.

Danke für deine Hilfe!

Aktualisieren:

Hier ist der Code aus dem Skript, der das API-Skript aufruft (einige aus Gründen der Vertraulichkeit geändert), da ich mich frage, ob das Problem möglicherweise nicht auf der Client- / Aufrufseite liegt. Vielleicht bekomme ich das OAuthToken nicht richtig? Oder hat das Token nicht die richtigen Berechtigungen?

  var token = ScriptApp.getOAuthToken();
  
  var header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + token,
  };
  
  var parms = [id];
  
  var data = {
    "function": "updateSettings",
    "parameters": parms,
    "devMode": true,
  }
  
  var options = {
    "method":"POST",
    "headers": header,
    "muteHttpExceptions": true,
    "payload": JSON.stringify(data)
  };
  
  // Call the API
  var result = UrlFetchApp.fetch(url, options);

Antworten

Chris Oct 07 2020 at 22:27

Ich habe es herausgefunden, nachdem ich Google kontaktiert hatte und leider nicht viel Hilfe bekommen hatte und noch ein paar Stunden lang versucht und recherchiert hatte ...

Was mir fehlte, war das Hinzufügen von "oathScopes" zur Datei manifest / appsscript.json. Ich spielte mit den benötigten Bereichen herum und endete mit den folgenden zwei unten gezeigten. Ich habe die Lösung anhand dieser Antwort herausgefunden: Verwenden von AuthToken, das über ScriptApp.getAuthToken () erhalten wurde, um Web-Apps in GAS aufzurufen .

Wechseln Sie im Skripteditor zur Manifestdatei anzeigen / anzeigen.

So sah es vorher aus:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

und so sieht es jetzt aus ...

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request"
    ]
}

Nach dem Hinzufügen habe ich appsscript.json gespeichert. Ich ging dann zu meinem runOnEdit-Trigger (dem aufrufenden Skript), entfernte ihn und fügte ihn erneut hinzu. Dies verursachte jedoch einen bösen Fehler:

Ich habe das nachgeschlagen und diesen Beitrag gefunden: Fehler beim Erstellen eines neuen Auslösers für Apps Script . Also habe ich den Code im Skripteditor ausgeführt und tatsächlich den Authentifizierungsbildschirm aufgerufen. Ich habe zugestimmt, den Trigger erneut hinzugefügt und jetzt funktioniert alles hervorragend beim Aufrufen der API!