使用Google Apps脚本覆盖图像文件

时间:2014-06-15 01:18:42

标签: google-apps-script google-drive-api

我可以使用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服务有PatchUpdate选项。

.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参数需要什么。所以我被困在那里。

2 个答案:

答案 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,您需要通过ResourcesAdvanced 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()})
}