Google apps script 使用Google Apps脚本获取文件内容高级驱动器API-Drive.Files.Get-或导出

Google apps script 使用Google Apps脚本获取文件内容高级驱动器API-Drive.Files.Get-或导出,google-apps-script,google-drive-api,Google Apps Script,Google Drive Api,我需要使用Google Apps脚本获取文本文件的文件内容。这个问题是针对谷歌应用程序脚本的 可以通过使用驱动器API发出HTTPS请求来获取文件内容,但我不想发出HTTPS请求。因此,我不是要求“变通”或不使用高级驱动器服务的方法 可以使用文件的自链接和“alt=media”选项,通过对驱动器REST API的HTTPS请求获取文件内容。但我不想这样做,因为我想避免用户授权外部请求的需要 下面是我现在使用Drive REST API执行此操作的方法 function getContentsOf

我需要使用Google Apps脚本获取文本文件的文件内容。这个问题是针对谷歌应用程序脚本的

可以通过使用驱动器API发出HTTPS请求来获取文件内容,但我不想发出HTTPS请求。因此,我不是要求“变通”或不使用高级驱动器服务的方法

可以使用文件的自链接和“alt=media”选项,通过对驱动器REST API的HTTPS请求获取文件内容。但我不想这样做,因为我想避免用户授权外部请求的需要

下面是我现在使用Drive REST API执行此操作的方法

function getContentsOfTxtFile_(po) {
try{
  var i,options,rtrnObj,selfLink,tkn,url;
  /*
    PASSED IN PARAMETERS
    po.id - the file id of the text file to get
  */
  
  selfLink = 'https://www.googleapis.com/drive/v3/files/' + po.id;
  url = selfLink + '?alt=media';//using alt=media returns the file content instead of the metadata resource

  tkn = ScriptApp.getOAuthToken();//Get the OAuth token

  options = {};
  options.headers = {Authorization: 'Bearer ' + tkn}
  options.muteHttpExceptions = true;

  for (i=1;i<3;i++) {//Only loop twice because sometimes there will legitimately not be a file
  try{
    rtrnObj = UrlFetchApp.fetch(url,options);//Make an external request to get the file content
    break;//If successful break out of the loop
  } catch(e) {
    if (i!==2) {Utilities.sleep(i*1500);}
    if (i>=2) {
      console.log('ERROR getting file content: ' + e + "Stack: " + e.stack)
    }
  };
  }
  
  if (!rtrnObj) {
    return false;
  }
  
  if (rtrnObj.getResponseCode() !== 200) { 
    return false;
  }
  return rtrnObj.getContentText();
}catch(e){
  console.error('Error ' + e)
}
}
上述代码生成错误:

信息:响应代码:200。信息:文件内容在这里

还可以从文件元数据获取“Web内容链接”,然后使用WebContent链接:

引述:

用于在浏览器中下载文件内容的链接。这是 仅适用于Google Drive中包含二进制内容的文件

文件位于:

我试过:

function getFileContent() {
  try{
    var content = Drive.Files.get('File ID Here',{alt:'media'});
  }catch(e) {
    Logger.log('message: ' + e.message)
  } 
  
}
function getFileContentW_Export() {
  try{
    var content = Drive.Files.export('FileID?alt=media','text/plain');
  }catch(e) {
    Logger.log('message: ' + e.message)
  } 
  
  Logger.log('content: ' + content)
}
或:

高级驱动器API似乎无法获取文件内容。高级驱动器API似乎有意省略了此功能,即使REST API能够获取文件内容

我在问题跟踪器中发布了一个bug报告,但是缺少这个功能并不被认为是bug

如果我能在范围
中使用它,我很乐意使用
DriveApp
”https://www.googleapis.com/auth/drive.file“
但是。以下代码:

var content = DriveApp.getFileById('ID').getAs(MimeType.PLAIN_TEXT).getDataAsString();
返回以下错误:

例外:您没有调用DriveApp.getFileById的权限。 所需权限:( ||)

甚至
https://www.googleapis.com/auth/drive.readonly
受到限制。请参阅链接部分中的“Gmail和驱动API”:


我测试了不同的作用域:驱动器和驱动器.file用于
文件.export()
文件.get()

只有drive.filescope给了我404

为什么?

因为drive.file用于应用程序创建或打开的文件

请在此处查看:

对于在驱动器中创建的文件,请使用:

function fileGet(auth) {
  const drive = google.drive({ version: 'v3', auth });
  drive.files.get({
      fileId: fileId
    }).then(res => console.log(res))
    .catch(e => console.log(e));
}
参考:

会导致错误。错误是什么?请参阅更新<代码>消息:响应代码:200。消息:文件内容在这里为什么不使用我正在尝试专门使用范围为
的高级驱动器服务?”https://www.googleapis.com/auth/drive.file“
以限制我需要向用户请求的权限。代码在一个附加组件中,我不想请求对用户驱动器的完全访问。这将导致需要通过一项特殊的安全评估,该评估需要花费15000美元才能获得谷歌的批准。难道
DriveApp
不能与
一起使用吗?”https://www.googleapis.com/auth/drive.file“
?我知道的唯一条件(使用
drive.file
)是脚本应该已经创建/打开了您请求的文件。文件是由您的脚本创建的吗?AppScript中没有类
google
。我使用的是Advanced Drive服务,该服务启用后,会在代码编辑器中显示
Drive
类。
google.drive()
如何在应用程序脚本中的“gs”文件中工作?@Alan只是好奇:为什么会出现这种情况,因为drive.file用于应用程序创建或打开的文件,而脚本满足了这些文件的要求?@AlanWells我使用node.js进行测试。这样您就可以了解它是如何工作的了。@请在此处进行主检查::对应用程序创建或打开的文件的逐文件访问。文件授权是基于每个用户授予的,并在用户取消应用程序的授权时被撤销。我的应用程序脚本项目使用Google文件选择器,用户使用该选择器来指定应用程序脚本项目可以访问哪些文件。一旦用户使用Google file picker选择了一个文件,Google就会在内部“知道”作用域可以访问该文件。如果应用程序脚本项目创建了PDF文件,则它可以访问该文件,因为应用程序脚本项目创建了该文件。
function fileExport(auth) {
  const drive = google.drive({ version: 'v3', auth });
  drive.files.export({
      fileId: fileId,
      mimeType: "text/plain"
    }).then(res => console.log(res))
    .catch(e => console.log(e));
}
function fileGet(auth) {
  const drive = google.drive({ version: 'v3', auth });
  drive.files.get({
      fileId: fileId
    }).then(res => console.log(res))
    .catch(e => console.log(e));
}