【问题标题】:Overwrite an Image File with Google Apps Script使用 Google Apps 脚本覆盖图像文件
【发布时间】:2014-06-15 01:18:42
【问题描述】:

我可以使用 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 参数可能是元数据。 fileId 是不言自明的。我猜optionalArgs 是遵循 HTTP 请求补丁语义的参数?我不知道。

看起来 Patch 和 Update 都会更新数据。更新是一个PUT 请求,它将

如果您不提供可选参数,则清除之前设置的数据。

根据文档。因此使用 Patch 请求更安全,因为任何缺少的参数都会被忽略。我还没有尝试过,但也许这就是答案。

Patch 出现错误,所以我试试Update

.update(resource, fileId, mediaData)

它有一个 blob 形式的 mediaData 参数。我认为这就是我所需要的。但我不确定resource 参数需要什么。所以我被困在那里了。

【问题讨论】:

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


    【解决方案1】:

    可以使用 Google Apps 脚本和 DriveAPI 使用 update() 方法覆盖图像文件:

    .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 设置为ON

    var allFilesByName,file,myFolder,myVar,theFileID,thisFile;
       //Define var names without assigning a value
    
    file = {
      title: myFileName,
      mimeType: 'image/jpeg'
    };
    
    myFolder = DriveApp.getFolderById('Folder ID');
    
    allFilesByName = myFolder.getFilesByName(myFileName);
    
    while (allFilesByName.hasNext()) {
      thisFile = allFilesByName.next();
      theFileID = thisFile.getId();
      //Logger.log('theFileID: ' + theFileID);
      
      myVar = Drive.Files.update(file, theFileID, uploadedBlob);
    };
    

    【讨论】:

    • 我可以知道您在 Google 开发人员文档中的哪里可以找到 Drive.Files.update 的 API 参数说明吗?没找到。因为我颠倒了前两个参数,你帮我解决了我自己的问题..
    • Drive API 参考位于此链接:Google Documentation 参考中的 REST API 和 Apps 脚本的语法不同。但是 Apps 脚本在自动完成中给出了语法。
    • 谢谢!我没有考虑自动完成。当然!
    • 在这里更新也是为了帮助别人。在团队驱动的情况下,最后添加supportsTeamDrives 参数。像这样Drive.Files.update({ title: currentFile.getName(), mimeType: currentFile.getMimeType() }, currentFile.getId(), blobOfNewContent,{supportsTeamDrives: true});
    • 感谢 @DarpanSanghavi 提供有关 supportTeamDrives 的技巧,Drive API 在没有此属性的情况下返回错误!
    【解决方案2】:

    谢谢你的这首歌!

    这让我找到了解决问题的方法:在复制并移动他的电子表格后移动绑定的表单

    必须在“资源脚本编辑器”中激活云端硬盘应用高级服务才能运行此脚本。

    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()})
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多