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