我可以使用Google Apps脚本覆盖图片文件吗?我试过了:
file.setContent(newBlobImage);
file.replace(newBlobImage);
这些都不奏效。 .setContent()
将删除文件中的任何数据,看起来它可能只是将变量名称写为文本,或类似的东西。我假设.setContent()
和.replace()
都用于文本文档,也许这就是他们不能工作的原因。
如果是文本文件或电子表格,我可以清除它,然后添加新内容。
我可以删除该文件,然后创建一个新文件,但如果还有其他方法,我宁愿不这样做。
如果我写一个同名文件,它不会覆盖现有文件,它会创建另一个同名文件。
我能够删除文件的唯一方法是DocsList
,而我创建图片文件的唯一成功就是使用DriveApp
。因此,我必须使用DocsList
删除文件,然后使用DriveApp
创建另一个文件。
好吧,我已经弄明白了如何在不将文件发送到垃圾箱的情况下删除文件,因此我以后不需要清理垃圾。 Apps脚本中的Google Drive SDK
有一个remove
方法,无法将文件发送到垃圾箱,它已经消失了。
var myFolder = DriveApp.getFolderById('3Bg2dKau456ySkhNBWB98W5sSTM');
thisFile = myFolder.getFilesByName(myFileName);
while (thisFile.hasNext()) {
var eachFile = thisFile.next();
var idToDLET = eachFile.getId();
Logger.log('idToDLET: ' + idToDLET);
var rtrnFromDLET = Drive.Files.remove(idToDLET);
};
因此,我将DriveApp
服务与DriveAPI
相结合,删除文件而不将其发送到垃圾箱。 DriveAPI
.remove需要文件ID,但我没有文件ID,因此按名称查找文件,然后检索文件ID,然后使用ID删除文件。所以,如果我找不到覆盖文件的方法,我至少可以删除旧文件,而不会丢弃它。
我刚注意到DriveAPI
服务有Patch
和Update
选项。
.patch(resource, fileId, optionalArgs)
Google Documentation Patch更新文件元数据。
resource
arg可能是元数据。 fileId
是自我解释的。我猜测optionalArgs
是遵循HTTP请求补丁语义的参数吗?我不知道。
Patch和Update看起来都会更新数据。更新是PUT
请求
如果您不提供可选参数,会清除以前设置的数据。
根据文件。因此,使用Patch请求会更安全,因为任何缺少的参数都会被忽略。我还没有尝试过,但也许这就是答案。
我在Patch
收到错误,因此我会尝试Update
:
.update(resource, fileId, mediaData)
它以blob的形式存在mediaData的arg。而且我认为这就是我需要的。但我不确定resource
参数需要什么。所以我被困在那里。
答案 0 :(得分:8)
我弄清楚了。我可以使用Google Apps脚本和DriveAPI覆盖图像文件。我正在使用:
.update(File resource, String fileId, Blob mediaData)
file resource
的位置:
var myFileName = 'fileName' + '.jpg';
var file = {
title: myFileName,
mimeType: 'image/jpeg'
};
我使用DriveApp服务获取文件ID,而Blob是用户上传的内容。
要使用DriveAPI
,您需要通过Resources
,Advanced Google Services
菜单添加它。将Drive API
设置为开启。
var file = {
title: myFileName,
mimeType: 'image/jpeg'
};
var myFolder = DriveApp.getFolderById('Folder ID');
var allFilesByName = myFolder.getFilesByName(myFileName);
while (allFilesByName.hasNext()) {
var thisFile = allFilesByName.next();
var theFileID = thisFile.getId();
Logger.log('theFileID: ' + theFileID);
var myVar = Drive.Files.update(file, theFileID, uploadedBlob);
};
答案 1 :(得分:2)
谢谢你这条赛道!
这让我找到了解决问题的方法:复制后移动绑定表单并移动他的电子表格。
必须在"资源脚本编辑器中激活Drive app高级服务"运行这个脚本。
function spreadsheetCopy() {
// Below is the file to be copied with a bound form.
var fileToCopy = DriveApp.getFileById("file_key"); // key is fileId
var saveFolder = DriveApp.getFolderById("folder_key"); // key is folderId
var currentFolder = "";
( fileToCopy.getParents().next() ) ? currentFolder = fileToCopy.getParents().next() : currentFolder = DriveApp.getRootFolder();
Logger.log(currentFolder)
var copyFile = fileToCopy.makeCopy(saveFolder),
copyName = copyFile.getName();
Utilities.sleep(30000);
moveFormCopy(currentFolder, saveFolder, copyName);
}
function moveFormCopy(currentFolder, saveFolder, copyName) {
var formsInFolder = currentFolder.getFilesByType(MimeType.GOOGLE_FORMS);
var form, copyForm, copyFormMimeType, copyFormName, copyFormId;
while ( formsInFolder.hasNext() ) {
form = formsInFolder.next();
if ( copyName === form.getName() ) {
copyForm = form;
copyFormMimeType = copyForm.getMimeType();
copyFormName = copyForm.getName();
copyFormId = copyForm.getId();
break;
}
};
var resource = {title: copyName, mimeType: copyFormMimeType};
Drive.Files.patch(resource, copyFormId, {addParents: saveFolder.getId(), removeParents: currentFolder.getId()})
}