Google Script上传文件至Drive时如何实现同名文件覆盖
问题场景
基于Google Apps Script开发的程序用于拉取指定URL的图片上传至Google Drive,程序可正常执行,但现有逻辑每次运行都会重复创建多个同名文件,需要实现同名文件自动覆盖,避免生成多份重复文件。
原有代码如下:
function myFunction() { var url ="https://html.com/wp-content/uploads/flamingo.jpg"; var response = UrlFetchApp.fetch(url); console.log(response.getResponseCode()); var blob=response.getAs('image/jpeg'); var folder = "1WnbHBPcYd9S4XwXpcYEMX32k********"; var fileName=decodeURIComponent(url.split("/").pop()); console.log("File named : "+fileName); var file=DriveApp.getFolderById(folder).createFile(blob); // Set the name to the created file after creating it! file.setName("image.jpeg"); }
原因说明
Google Drive本身允许同文件夹下存在多个同名文件,因此createFile接口不会自动触发覆盖逻辑,直接调用就会每次生成新文件。
修复方案
在创建新文件前,先检索目标文件夹下的同名存量文件,将其移入回收站后再上传新文件,即可实现自动覆盖的效果。
修正后的可直接运行代码:
function myFunction() { var url = "https://html.com/wp-content/uploads/flamingo.jpg"; var response = UrlFetchApp.fetch(url); console.log(response.getResponseCode()); var blob = response.getAs('image/jpeg'); var folderId = "1WnbHBPcYd9S4XwXpcYEMX32k********"; var targetFolder = DriveApp.getFolderById(folderId); // 统一目标文件名,原代码先截取URL尾文件名后续又手动重命名为image.jpeg,直接统一声明避免匹配失效 var fileName = "image.jpeg"; console.log("Processing file: " + fileName); // 检索文件夹下所有同名存量文件 var existingFiles = targetFolder.getFilesByName(fileName); // 遍历清除所有同名存量文件,避免残留多份重复文件 while (existingFiles.hasNext()) { existingFiles.next().setTrashed(true); } // 上传新文件 targetFolder.createFile(blob).setName(fileName); }
可选优化
如果不想删除旧文件,可以直接更新旧文件的内容,省去删除+新建的步骤,但二进制文件直接更新内容偶发兼容问题,图片类资源优先使用删除重建的方案,替换逻辑如下:
if (existingFiles.hasNext()) { // 取第一个匹配的旧文件直接更新内容 var existingFile = existingFiles.next(); // 清除其余多余的同名文件 while (existingFiles.hasNext()) { existingFiles.next().setTrashed(true); } existingFile.setContent(blob); } else { // 不存在旧文件直接新建 targetFolder.createFile(blob).setName(fileName); }
内容的提问来源于stack exchange,提问作者Nived Padikkal
相关产品推荐
相关产品推荐

