使用Google Apps脚本将新的csv文件更新到G驱动器后,如何用新数据覆盖同一工作表

时间:2019-07-17 02:58:37

标签: csv google-apps-script

首先,在上传新的.csv文件后,我执行了脚本。然后,.csv文件将转换为Google云端硬盘文件夹中的Google表格。我现在面临的问题是,当我删除.csv文件并上传另一个.csv文件时,它正在创建一个新工作表。上传新的.csv文件后,如何更新同一工作表?

enter image description here

到目前为止,此代码会将.csv文件转换为文件夹中的工作表。重新上传另一个具有相同名称的.csv文件时,我不确定如何覆盖工作表。当我上传新的.csv文件时,我不希望脚本创建另一个工作表

function convert() {
  var folder = DriveApp.getFolderById('');
  var files = folder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    Drive.Files.copy({}, file.getId(), {convert: true});
  }
} 

我希望我上传的.csv文件覆盖Google云端硬盘中的现有工作表

1 个答案:

答案 0 :(得分:2)

  • CSV文件和Google Spreadsheet文件放在同一文件夹中。
  • CSV文件的文件名为扩展名.csv。但是Spreadsheet的文件名没有扩展名。例如,您要使用CSV文件的sample.csv和电子表格的sample的文件名作为同一文件名。
  • 当文件夹中只有一个CSV文件名时,您要将CSV文件转换为电子表格。
  • 如果文件夹中的CSV文件和电子表格具有相同的文件名,则要将CSV文件覆盖到现有的电子表格中。
  • 创建和覆盖文件后,您要删除文件夹中的所有CSV文件。

我可以像上面那样理解。如果我的理解是正确的,那么该修改如何?修改后的脚本流程如下。请认为这只是几个答案之一。

流量:

  1. 检索特定文件夹中的所有文件。
  2. 创建一个用于处理文件的对象。
    • 在这种情况下,将创建{create: [], overWrite: [], deleteCsvFiles: []}
  3. 如果有文件要转换为新的电子表格,则这些CSV文件将转换为新的电子表格。
  4. 如果存在用于覆盖现有电子表格的文件,则现有的电子表格文件会被CSV文件覆盖。
  5. 该文件夹中的所有CSV文件都将被删除。

修改后的脚本:

在运行脚本之前,请设置变量folderId。然后,请再次确认是否在高级Google服务中启用了Drive API。

function convert() {
  var folderId = "###"; // Please set the folder ID here.

  // Retrieve all files in the folder
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
  var fileList = [];
  while (files.hasNext()) {
    var file = files.next();
    fileList.push({
      id: file.getId(),
      name: file.getName().split(".")[0],
      mimeType: file.getMimeType()
    });
  }

  // Create an object for processing files
  var temp = {};
  var res = fileList.reduce(function(o, e, i) {
    if (e.mimeType == MimeType.CSV) o.deleteCsvFiles.push(e.id);
    if (e.name in temp) {
      if (temp[e.name].length == 2) throw new Error("Error");
      if (fileList[temp[e.name][0]].mimeType != e.mimeType) {
        o.overWrite.push({
          from: e.mimeType == MimeType.CSV ? e.id : fileList[temp[e.name][0]].id,
          to: e.mimeType == MimeType.GOOGLE_SHEETS ? e.id : fileList[temp[e.name][0]].id,
        });
      } else {
        throw new Error("Error");
      }
      temp[e.name].push(i);
    } else {
      temp[e.name] = [i];
    }
    if (i == fileList.length - 1) {
      o.create = Object.keys(temp).reduce(function(ar, e) {
        if (temp[e].length == 1 && fileList[temp[e][0]].mimeType == MimeType.CSV) {
          ar.push(fileList[temp[e][0]]);
        }
        return ar;
      }, []);
    }
    return o;
  }, {create: [], overWrite: [], deleteCsvFiles: []});

  // Create new Spreadsheet from CSV file
  if (res.create.length > 0) {
    res.create.forEach(function(e) {
      Drive.Files.copy({}, e.id, {convert: true});
    });
  }

  // Overwrite Spreadsheet by CSV file
  if (res.overWrite.length > 0) {
    res.overWrite.forEach(function(e) {
      var mediaData = DriveApp.getFileById(e.from).getBlob();
      Drive.Files.update({}, e.to, mediaData);
    });
  }

  // // Delete CSV files
  // if (res.deleteCsvFiles.length > 0) {
  //   res.deleteCsvFiles.forEach(function(e) {
  //     Drive.Files.remove(e);
  //   });
  // }
}

注意:

  • 此修改后的脚本假定具有相同文件名的文件仅为2个文件。如果文件名相同的文件超过3个,则会引发错误。
  • 如果文件名和mimeType相同,则会引发错误。
  • 当CSV文件的文件大小较大时,可能会发生错误。
  • 在当前阶段,我注释了“删除CSV文件”的脚本。因为运行此脚本时,将删除CSV文件。使用此脚本时,请小心。

参考文献: