如果该文件已存在于Google云端硬盘中,请跳过处理.xls到Google表格脚本

时间:2018-04-10 16:38:37

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

我目前正在使用此代码自动将Google云端硬盘中所有上传的.xls文件转换为Google表格。

function importXLS(){
  var files = DriveApp.searchFiles('title contains ".xls"');
  while(files.hasNext()){
    var xFile = files.next();
    var name = xFile.getName();
    if (name.indexOf('.xls')>-1){
      var ID = xFile.getId();
      var xBlob = xFile.getBlob();
      var newFile = { title : name,
                     key : ID,
                     'parents':[{"id":"12FcKokB-ppW7rSBtAIG96uoBOJtTlNDT"}]
                    }
      file = Drive.Files.insert(newFile, xBlob, {
        convert: true
      });
    }
  }
}

它工作正常,但如果输出文件夹中已存在同名文件,则会失败。即使我从来没有在技术上看到下面的错误(因为它按计划运行而不像屏幕截图那样手动触发),如果文件已经存在,我宁愿跳过转换过程。

enter image description here

如果可能的话,我也希望每次都避免覆盖它,因为我觉得这会浪费处理时间。如何编辑此代码,如果该文件夹中已存在文件名,请完全跳过整个代码?

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以尝试两件事:

  1. 获取目标文件夹中已有的文件名,并在尝试复制之前检查该文件是否存在。
  2. try..catch语句中包含执行复制的代码部分。
  3. 这两个都应该独立工作,但使用try..catch语句会捕获所有错误,因此最好将它们组合起来。 (您可以在开发者控制台中查看error logs。)执行此操作,您将能够跳过与目标文件夹中已存在的文件同名的文件以及可能出现的任何其他错误终止你的脚本完成。

    function importXLS(){
      var files = DriveApp.searchFiles('title contains ".xls"');
      var destinationFolderId = "12FcKokB-ppW7rSBtAIG96uoBOJtTlNDT";
      var existingFileNames = getFilesInFolder(destinationFolderId);
      while(files.hasNext()){
        var xFile = files.next();
        var name = xFile.getName();
        try {
          if (!existingFileNames[name] && (name.indexOf('.xls')>-1)) {
            var ID = xFile.getId();
            var xBlob = xFile.getBlob();
            var newFile = { title : name,
                           key : ID,
                           'parents':[{"id": destinationFolderId}]
                          }
            file = Drive.Files.insert(newFile, xBlob, {
              convert: true
            });
          }
        } catch (error) {
          console.error("Error with file " + name + ": " + error);
        }
      }
    }
    
    /**
     * Get an object of all file names in the specified folder.
     * @param {string} folderId
     * @returns {Object} files - {filename: true}
     */
    function getFilesInFolder(folderId) {
      var folder = DriveApp.getFolderById(folderId);
      var filesIterator = folder.getFiles();
      var files = {};
      while (filesIterator.hasNext()) {
        var file = filesIterator.next();
        files[file.getName()] = true;
      }
      return files;
    }