ScriptApp.getOAuthToken没有得到正确的权限驱动通过url获取应用程序?

问题描述 投票:-1回答:1

试图用一个非常简单的脚本来探索这个问题,但我得到一个权限不足的错误。

  function mini(){
    var gdriveId = "1hp8ncIG4Ww7FH8wi7HjJzzzzzzz";
    var options = {
    method: "GET",
    headers: {
          'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
        },
   }
   var url = "https://www.googleapis.com/drive/v2/files/"+gdriveId+"/children";
   var response = JSON.parse(UrlFetchApp.fetch( url,  options).getContentText());
  }

我试着在高级google服务下拉菜单中启用v2 drive api,但没有成功。

google-apps-script google-drive-api
1个回答
2
投票

我相信你的情况和目标如下。

  • 来自 gdriveId 在你的脚本中,我以为你要检索的是在根目录下的 gdriveId 使用 Drive API v2 中的 "Children: list" 方法。
  • 你已经在高级谷歌服务中启用了Drive API。

对此,这个答案如何?

修改要点。

  • 当你的脚本被放到新的GAS项目中,并且在Advanced Google Services中启用了Drive API,那么项目的作用域就只有 https://www.googleapis.com/auth/script.external_request. 脚本编辑器可以自动检测到所需的作用域,但即使只启用Drive API,似乎也没有添加作用域。但是,即使只启用Drive API,似乎也没有添加任何作用域。我想你的问题的原因是这样的。
    • 在上面的情况下,如果你想检索包括所需作用域在内的访问令牌,为了让脚本编辑器自动检测到所需作用域,你可以使用以下方法 https://www.googleapis.com/auth/drive.readonly例如,请将 // DriveApp.getFiles() 作为注释行添加到脚本中。
    • 在这种情况下,当你在脚本中使用其他作用域的方法时,这些作用域可以被脚本编辑器自动检测和添加。

修改后的脚本 1:

当你的脚本被修改后,它就变成了如下的样子。

function mini(){
  var gdriveId = "1hp8ncIG4Ww7FH8wi7HjJzzzzzzz";
  var options = {
  method: "GET",
  headers: {
        'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
      },
 }
 var url = "https://www.googleapis.com/drive/v2/files/"+gdriveId+"/children";
 var response = JSON.parse(UrlFetchApp.fetch( url,  options).getContentText());
}

// DriveApp.getFiles()  // <--- Added this comment line. By this, the scope of https://www.googleapis.com/auth/drive.readonly is added.

修改后的脚本2。

当使用Advanced Google service的方法时,会将Advanced Google service的作用域改为 https://www.googleapis.com/auth/drive 是自动添加的。这样,下面的脚本就可以用了。

function test() {
  var gdriveId = "1hp8ncIG4Ww7FH8wi7HjJzzzzzzz";
  var res = Drive.Children.list(gdriveId);
  console.log(res)
}

其他模式。

从2020年6月1日起,共享驱动器中的文件和文件夹 可以通过驱动器服务进行检索。所以你也可以使用下面的脚本。

function myFunction() {
  const getFolderList = (id, folders = []) => {
    const f = DriveApp.getFolderById(id);
    const fols = f.getFolders();
    let temp = [];
    while (fols.hasNext()) {
      const fol = fols.next();
      temp.push({name: fol.getName(), id: fol.getId(), parent: f.getName()});
    }
    if (temp.length > 0) {
      folders.push(temp);
      temp.forEach((e) => getFolderList(e.id, folders));
    }
    return folders.flat();
  };

  var gdriveId = "###"; // Please set the Drive ID.
  const res = getFolderList(gdriveId);
  console.log(res);
}

参考文献


1
投票

如果你想用ScriptApp.getOAuthToken()给权限写,只需在注释中加入以下代码,在运行时授权即可。如果你不这样做,你将只能下载和浏览。

//DriveApp.addFile("test");

參考網址:https:/00m.inUeeOB

© www.soinside.com 2019 - 2024. All rights reserved.