如何正确使用 Advanced Drive Services 来替换现有电子表格,而不是每次调用函数时都制作一个新电子表格?

How to use Advanced Drive Services properly to replace an existing spreadsheet instead of making a new one every time the function gets called?

我一直在从共享的公司驱动器中获取大量源传播sheet,将它们规范化,并将它们组合成一个主sheet供我使用。一些 sheet 被上传为 excel 文档。期望普通员工获得正确的格式或让某人手动更改文件是不切实际的,因此我编写了一个脚本来完成它。

整个过程中唯一的问题是每次有人上传、更新或替换 excel 文件时,代码必须以 Google 表格格式制作新的临时副本而不是覆盖一个现有的。此外,我必须根据临时文件在通过管道传输到主文件之前需要更改的方式在不同的地方调用 deleteTempFile(tempID) 函数(尽量避免使用全局变量)。

我已经对以下代码进行了数周的修改,但总是会回到这个代码,因为我只是没有发现在现有表格上使用 Drive.Files.insert 或在 Drive.Files.update.

function convertXlsxToGsheets(excelFile, tempName, tempFolderID) {
  var blob = excelFile.getBlob();

  var payload = {title: tempName, parents: [{id:tempFolderID}]};  // Problem lines
  var tempSpreadsheet = Drive.Files.insert(payload, blob, {convert: true});  // Problem lines

  var tempID = tempSpreadsheet.getId();
  Logger.log('Temporary Spreadsheet ID: ' + tempID);
  return tempID;
}

我相信你的目标如下。

  • 您想用 XLSX 数据覆盖现有的整个电子表格而不更改电子表格的文件 ID。
  • 您想使用高级 Google 服务的驱动器 API 来实现此目的。

在这种情况下,我认为使用驱动器 API 的 Drive.Files.update()。示例脚本如下

示例脚本:

在使用此脚本之前,请确认驱动器 API 是否已在高级 Google 服务中启用。 Ref

var existingSpreadsheetId = "###";  // Please set the Spreadsheet ID of the existing spreadsheet you want to overwrite.
var blob = excelFile.getBlob();  // This is from your script.
Drive.Files.update({}, existingSpreadsheetId, blob);

重要提示:

在此示例脚本中,现有的电子表格被覆盖。请注意这一点。所以当你测试这个脚本时,我想建议使用一个示例电子表格。

参考: