You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

按文件名覆盖文件夹内现有文件问题排查(第二部分)

解决Google Apps Script中同名文件时PDF保存到根目录的问题

我看了你的代码,问题出在文件创建和处理的顺序上:你先在Drive根目录创建了PDF文件,再去处理Squads文件夹里的同名文件,最后才尝试把根目录的文件移动到目标文件夹。这个流程在删除同名文件后,可能因为Drive API的状态同步延迟,导致移动操作没有生效,最终文件留在了根目录。

修正后的代码逻辑

正确的做法应该是先处理目标文件夹里的同名文件,再直接在目标文件夹内创建新文件,完全跳过根目录创建的步骤,从根源上避免文件跑到根目录的问题。以下是修改后的完整代码:

var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' + token } });
var pdfBlob = docurl.getBlob();

// 获取文件名
var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();

// 找到或创建Squads文件夹
var folder;
if (DriveApp.getFoldersByName("Squads").hasNext()) {
  folder = DriveApp.getFoldersByName("Squads").next();
} else {
  folder = DriveApp.createFolder("Squads");
}

// 检查文件夹内是否有同名文件,有则删除(处理可能存在的多个同名文件)
var existingFiles = folder.getFilesByName(fileName);
while (existingFiles.hasNext()) {
  var duplicateFile = existingFiles.next();
  // 方式1:移到回收站(简单稳妥)
  folder.removeFile(duplicateFile);
  duplicateFile.setTrashed(true);
  
  // 方式2:彻底删除(需要Drive API授权,保留你原来的逻辑)
  // var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicateFile.getId();
  // var dres = UrlFetchApp.fetch(durl, {
  //   method: 'delete',
  //   muteHttpExceptions: true,
  //   headers: {'Authorization': 'Bearer '+token}
  // });
  // if(dres.getResponseCode()>=400) {
  //   console.log("删除文件出错:" + dres.getContentText());
  // }
}

// 直接在Squads文件夹内创建新PDF文件
var newFile = folder.createFile(pdfBlob).setName(fileName);

关键修改点说明

  • 调整流程顺序:先确保目标文件夹存在,再清理同名旧文件,最后创建新文件,避免根目录产生临时文件。
  • 直接在目标文件夹创建文件:用folder.createFile(pdfBlob)代替DriveApp.createFile(pdfBlob),文件直接生成在Squads文件夹里,不需要后续移动操作,彻底杜绝根目录遗留文件的问题。
  • 完善同名文件处理:用while循环处理同一文件夹内可能存在的多个同名文件(Drive允许同名文件存在),确保所有旧文件都被清理。
  • 简化删除操作:如果不需要彻底删除,移到回收站的方式更简洁;如果需要彻底删除,保留你原来的Drive API调用逻辑即可。

这样修改后,无论Squads文件夹里有没有同名文件,新PDF都会直接保存到该文件夹,不会再跑到根目录了。

内容的提问来源于stack exchange,提问作者Digital Farmer

火山引擎 最新活动