Google apps script 如果已经存在同名文件(谷歌应用程序脚本+;谷歌工作表),则不保存PDF

Google apps script 如果已经存在同名文件(谷歌应用程序脚本+;谷歌工作表),则不保存PDF,google-apps-script,google-sheets,Google Apps Script,Google Sheets,今天,脚本中定义如何将PDF保存到Google Drive中的共享文件夹的部分如下所示: var token = ScriptApp.getOAuthToken(); var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' + token } }); var pdfBlob = docurl.getBlob(); //...get token and Blob

今天,脚本中定义如何将PDF保存到Google Drive中的共享文件夹的部分如下所示:

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

    //...get token and Blob (do not create the file);

    var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();

    //Access or create the 'Squads' folder;
    var folder; //declare folder;
    var folders = DriveApp.getFoldersByName("Squads"); //returns iterator;
    if(folders.hasNext()) {
      folder = folders.next();
    }else {
      folder = DriveApp.createFolder("Squads");
    }

    //Remove duplicate file with the same name;
    var existing = folder.getFilesByName(fileName); //returns iterator;
    if(existing.hasNext()) {
      var duplicate = existing.next();

      var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
      var dres = UrlFetchApp.fetch(durl,{
        method: 'delete',
        muteHttpExceptions: true,
        headers: {'Authorization': 'Bearer '+token}
      });
      if(dres.getResponseCode()>=400) {
        //handle errors;
      }
    }

    //add file;
    folder.createFile(pdfBlob).setName(fileName);
当我与其他人共享文件夹时,我只能编辑我拥有的文件

我想在以下问题上得到一些帮助

1-分析是否有我试图保存的文件名,如果我拥有该文件,则尝试删除该文件以保存新文件。(已存在于脚本中)

2-如果文件来自其他人,他将无法在上述步骤中删除该文件。(已存在于脚本中)

3-如果无法删除,他将放弃保存文件,因为这样,文件夹中就不会有重复的文件,且数据相同。(脚本中尚不存在)→ (我的需要)

问题:在当前格式中,它尝试删除现有文件以创建新文件,无论是否能够删除,他都会保存新文件,有时会导致同一文件夹中两个不同的人创建两个文件。这不可能发生。

如果无法保存,我需要它不要给出错误消息,因为如果它不保存文件,它下面还有更多行需要一直运行到脚本结束,因为已经有一行同名。

我尝试使用IF方法,但它导致一个错误,使脚本停止,我尝试使用的基础是:

var existing = folder.getFilesByName(fileName); //returns iterator;
    if(existing.hasNext()) {
      var duplicate = existing.next();
           if(dres.getResponseCode()>=400) {
        //handle errors;
  • 仅当文件可以删除时,才创建新文件
  • 即使无法删除文件,也不希望停止脚本
如果我的理解是正确的,那么这个答案呢?请把这看作是几个答案中的一个

修改点:
  • 在您的脚本中,我认为需要修改
    if(existing.hasNext()){}
    的if语句
  • muteHttpExceptions:true
    用于请求。因此,即使状态代码不是200,脚本也不会停止
  • 如果您只想在可以删除文件的情况下创建新文件,那么添加
    if(status==200)
    如何
修改脚本: 修改脚本时,请修改脚本的
if(existing.hasNext()){}
的if语句

if(existing.hasNext()) {
  var duplicate = existing.next();

  var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
  var dres = UrlFetchApp.fetch(durl,{
    method: 'delete',
    muteHttpExceptions: true,
    headers: {'Authorization': 'Bearer '+token}
  });
  var status = dres.getResponseCode(); // Added
  if (status >=400) { // Modified
    //handle errors;
  } else if (status == 200) {
    folder.createFile(pdfBlob).setName(fileName); // Added
  }
} else {
  folder.createFile(pdfBlob).setName(fileName); // Added
}
  • 在此修改中,请删除文件夹.createFile(pdfBlob).setName(文件名)在问题脚本的最后一行
注:
  • 与其他模式一样,首先,如果检查了文件的所有者,那么下面修改的脚本如何

    if(existing.hasNext()) {
      var duplicate = existing.next();
      if (duplicate.getOwner().getEmail() == Session.getActiveUser().getEmail()) { // Added
        var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
        var dres = UrlFetchApp.fetch(durl,{
          method: 'delete',
          muteHttpExceptions: true,
          headers: {'Authorization': 'Bearer '+token}
        });
        var status = dres.getResponseCode(); // Added
        if (status >=400) { // Modified
          //handle errors;
        } else if (status == 200) {
          folder.createFile(pdfBlob).setName(fileName); // Added
        }
      }
    } else {
      folder.createFile(pdfBlob).setName(fileName); // Added
    }
    

如果我误解了你的问题,而这不是你想要的方向,我道歉。

@Frederico Mattos谢谢你的回答。虽然这两种模式都可以工作,但在开始检查文件所有者时,可以降低处理成本,因为当文件所有者不是您时,
UrlFetchApp.fetch()
不会运行。所以我认为你的回答是肯定的。你的回答总是非常认真,字迹准确。再次感谢你@Frederico Mattos感谢您的回复。我更新了我的答案。你能确认一下吗?如果那不是你想要的结果,请告诉我。在这种情况下,您还可以将
folder.createFile(pdfBlob).setName(fileName)
声明为函数。已确认脚本执行。一切都很顺利。谢谢你,伙计@Frederico Mattos
if(status=200)
与将
200
替换为
status
相同。语句的脚本始终处于运行状态。在本例中,如果(状态>=400){//handle errors;}folder.createFile(pdfBlob).setName(文件名),也可以修改为