DriveApp.getFileById için Google Apps Script API Yetkilendirmeleri

Oct 07 2020

Hemen hemen tüm komut dosyalarını / işlevleri doğrudan, ancak bir çiftini bir API aracılığıyla çalıştıran bir Google Cloud Platform Projem (GCP) var. Her şeye yalnızca G Suite alanında dahili olarak erişilebilir ve OAuth izin ekranı Uygulama Türü "Dahili" dir.

Bir API aracılığıyla değil, her x dakikada bir doğrudan zamanlayıcıda çağrılan bir komut dosyam var. Bir gerçekleştirir

DriveApp.getFileByID(pictureID)

Bu harika çalışıyor! Sorun yok.

Aynı GCP Projesinde, bir zamanlayıcı tarafından tetiklenerek çalıştırmak yerine bir API aracılığıyla çağrılarak çalışan farklı bir komut dosyam da var. İşte onu çağıran kod satırı (gerçekten önemli değil):

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

API betiği harika çalışıyor! Aşağıdaki satırlara gelene kadar:

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

Günlüğün sonucu

e = {"name":"Exception"}

PictureID'nin çalışan API olmayan komut dosyasındakiyle aynı olduğunu doğruladım. Yazılımın dosyaya gerçekten erişmek için değil, dosyaya erişimi olduğundan emin olmak için bu API çalıştırma komut dosyasında bir "dene" yapıyorum.

Bunun bir yetkilendirme sorunu olduğundan oldukça eminim. GCP'yi yalnızca bir süredir kullanıyorum, yetkilendirmeler konusunda biraz deneyimim var, ancak çok fazla değil.

İşte yetkilendirmelerle ilgili bazı detaylar ...

Projenin komut dosyaları Proje Özellikleri (Dosya / Proje Özellikleri), aşağıdaki OAuth Kapsamlarına ihtiyacı olduğunu gösterir:

Google'ın adresindeki belgelerine göre 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

Şimdi GCP Oauth izin ekranında tanımladığım kapsamlar:

Gördüğünüz gibi, drive, drive.readonly ve drive.file ekledim (gerçekten gerekli görünmüyor).

Hepsinden önemlisi, bu belirli resim dosyası GCP Projesi sahibinin, komut dosyalarının ve G Suite alanının üst düzey yöneticisinin Google Drive'ında saklanır. Kullanıcılar kendi Google Drive'larındaki resimleri bu yazılım / GCP sahibiyle paylaşacağından, durum her zaman böyle olmayacaktır. Bununla birlikte, şimdi bile bir zamanlayıcı tarafından tetiklenen komut dosyasının bu kullanıcı tarafından paylaşılan dosyalarla çalışacağını, ancak API aracılığıyla çağrılan komut dosyasının çalışmayacağını hissediyorum.

Bunun bir Yetkilendirme sorunu olduğundan oldukça eminim, ancak bir yerlerde bir şeyler eksik.

Yardımın için teşekkürler!

Güncelleme:

Burada API komut dosyasını ÇAĞIRAN komut dosyasındaki kod var (bazılarını gizlilik için değiştirdi), çünkü sorunun istemci / arayan tarafında olmayabilir mi diye merak ediyorum. Belki de OAuthToken'ı doğru şekilde alamıyorum? Veya jeton doğru izinlere sahip değil mi?

  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);

Yanıtlar

Chris Oct 07 2020 at 22:27

Google ile iletişime geçtikten sonra anladım ve ne yazık ki fazla yardım alamadım ve birkaç saat daha denemek ve araştırmak ...

Eksik olan şey, manifest / appsscript.json dosyasına "oathScopes" eklemekti. Gerekli kapsamlarla oynadım ve aşağıda gösterilen aşağıdaki ikisini elde ettim. Çözümü şu cevaba bakarak buldum : ScriptApp.getAuthToken () aracılığıyla elde edilen AuthToken'ı GAS'ta web uygulamalarını aramak için kullanmak .

Komut dosyası düzenleyicisinin içinde, bildirim dosyasını Görüntüle / Göster'e gidin.

İşte daha önce nasıl göründüğü:

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

ve işte şimdi göründüğü gibi ...

{
  "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"
    ]
}

Ekledikten sonra appsscript.json dosyasını kaydettim. Daha sonra runOnEdit tetikleyicime (çağıran komut dosyası) gittim, kaldırdım ve yeniden ekledim. Ancak bu, kötü görünen bir hataya neden oldu:

Buna baktım ve şu gönderiyi buldum: Apps Komut Dosyasında yeni tetikleyici oluştururken hata alma . Ben de kodu komut dosyası düzenleyicide çalıştırdım ve gerçekten de kimlik doğrulama ekranını açtı. Onayladım, tetikleyiciyi yeniden ekledim ve şimdi API çağrısında her şey harika çalışıyor!