Google apps script 在谷歌硬盘上有没有加快文件创建速度的批处理方法?
我需要在一个文件夹中的谷歌驱动器上创建许多单独的文件。目前,我认为唯一可以做到这一点的方法是使用folderName.createFile()。使用此命令逐个创建文件的速度非常慢Google apps script 在谷歌硬盘上有没有加快文件创建速度的批处理方法?,google-apps-script,google-drive-api,Google Apps Script,Google Drive Api,我需要在一个文件夹中的谷歌驱动器上创建许多单独的文件。目前,我认为唯一可以做到这一点的方法是使用folderName.createFile()。使用此命令逐个创建文件的速度非常慢 有没有一种更快的方法可以像从一系列文件中创建批处理工具一样完成这项工作?是的,最新的Google Drive API(v3)支持单个http调用中的任何100个操作。默认端点是/batch/api\u name/api\u version。大多数驱动器客户端库都内置了与之配合使用的函数 给出了详细信息,下面是中的一个示
有没有一种更快的方法可以像从一系列文件中创建批处理工具一样完成这项工作?是的,最新的Google Drive API(v3)支持单个http调用中的任何100个操作。默认端点是
/batch/api\u name/api\u version
。大多数驱动器客户端库都内置了与之配合使用的函数
给出了详细信息,下面是中的一个示例。请注意,所有查询在构造之后是如何queue()
-ed到批处理调用中的,批处理调用作为单个HTTP连接执行
评论更新:Google Drive API目前不支持批量文件上传或下载查询。考虑查看谷歌云平台的存储桶(或类似的服务)以获取更大规模的文件选项。 < P> OK,很高兴确认“强”>可以使用UrfFETCHAPP.FETCRAW(<)/<强> > 我是这样做的。我不是一名专业程序员,所以请原谅我在代码中的违规行为:)特别感谢@TheMaster和@Tanaike,他们让我走上了正确的道路 在web应用程序上,您需要应用以下代码:
//doPost (note I updated the code on stackoverflow after posting my answer as there was an error)
const doPost = e => {
try{
var diskPath = getFolder(e.parameter.diskPath)[0];
const file = diskPath.createFile(e.parameter.fileName,Utilities.newBlob(Utilities.base64DecodeWebSafe(e.parameter.file),e.parameter.contentType));
}
catch(e){
return ContentService.createTextOutput(e)
}
return ContentService.createTextOutput( 'Saved:' + 'e.parameter.fileName: '+e.parameter.fileName + 'e.parameter.contentType '+e.parameter.contentType);
}
代码必须作为web应用程序发布。在脚本编辑器中,单击“发布”,然后单击“作为web应用部署”,并选择“项目版本”作为“新建”。“谁有权访问应用:”应设置为“任何人,甚至匿名”,然后保存。您将获得一个公共URL,并在下面的脚本中输入该URL:
//save files function
function saveFiles(fileArr){ //note file blobs must have setName and have contentType set so we save them in the fetch array: arr = [[file1/Blob2,'image/jpeg',name1],[file2/Blob2,'text/html',name2],............];
var url = 'INSERT YOUR WEB APP PUBLIC URL HERE'
var fetchArr = [];
for (var i in fileArr){
var file = fileArr[i][0];
var bytes
try{ //if file is already blob prevent error getting Blob
bytes = file.getBlob().getBytes()
}
catch(e){
bytes = file.getBytes();
}
var fileName = fileArr[i][2];
var contentType = fileArr[i][1];
var payload = {
fileName: fileName,
contentType : contentType,
file: Utilities.base64EncodeWebSafe(bytes)
};
var options = {
url: url,
method: "POST",
payload: payload,
muteHttpExceptions : true,
};
fetchArr.push(options)
}
UrlFetchApp.fetchAll(fetchArr);
}
上面的代码创建一个包含附加文件的URL获取数组,然后将它们发布到web应用程序。然后,如果您有很多文件要同时保存到磁盘,web应用程序会异步保存这些文件,从而为您节省大量时间
为了运行代码,需要从构建阵列的另一个脚本调用saveFiles(fileArr)。数组应具有以下格式:
[[文件或blob,内容类型,新文件的名称作为字符串],[文件或blob,内容类型,新文件的名称作为字符串],…]
内容类型是,可以从旧文件(如果您没有创建新Blob)派生,如下所示:fileName.getContentType()。如果要创建新Blob,则应根据要创建的文件类型的MIME类型设置contentType
编辑:只是一个关于利率限制的说明。当我尝试一次性保存超过13个文件时,我达到了速率限制,但我能够每隔几秒钟发送10个文件,没有任何问题。为什么不使用for循环来执行此操作?@Kessy,因为它会很慢。批处理方法更快。@mich尝试直接使用高级Google服务或驱动api。@Master我以前从未使用过api。我查看了那里的方法,发现只有一个方法可以创建一个文件:@TheMaster我想我可以创建一个UrlFetchApp.fetchAll(http请求数组),这样google就可以一次处理所有的文件了。有意义吗?它不支持文件创建。您可以将任何一组API调用批处理在一起,并立即将它们发送到批处理端点。因此,在那个Java示例中,您可以说
driveService.permissions().create()
,而不是driveService.permissions().create()
,然后调用文件创建查询上的.queue(batch)
,您的链接页面上说,当前,Google Drive不支持媒体的批量操作,无论是上传还是下载。
,我相信,这将包括文件。创建。这仍然是一个很好的答案,因为这个页面似乎没有直接从指南或参考部分链接。啊,明白了。那么,您可能想在问题中反映您上传的愿望<代码>文件。默认情况下,创建
不是上载查询。在大多数文件系统中,upload
和create
是独立的操作;然而,谷歌的create
确实支持上传选项。我认为值得注意的是,与数据传输的开销相比,建立HTTP连接的开销可能很小。此外,您的用例是什么?也许像谷歌云平台存储桶这样的东西比谷歌硬盘更适合大量文件。我不是OP。你应该ping@michaeldonDo注意,如果有人能够找出发布的url,他们可以上传到你的硬盘上而不需要任何restrictions@TheMaster这可以通过只选择我自己作为“谁有权访问应用程序”来避免。但是需要使用oauth令牌相应地修改Urlfetch
。