使用GAS创建带有修改内容的子Google电子表格

时间:2018-07-18 21:36:02

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

我需要有关Google Apps脚本的帮助,该脚本使用模板报告文件,并通过在引用的单元格中设置ID号来生成个性化报告-这会更改动态更新的报告。

该脚本可以正常工作,因为它为数据数组中的每个ID创建了一个新文件。但是,所有子文件看起来都与父文件(模板)相同。它们不反映基于setValue()对单元格C3所做的更改。但是,运行脚本后,模板文件确实显示setValue在脚本运行时正在对C3进行更改。

parentFile.makeCopy()是否仅按脚本运行之前的方式复制源电子表格,而不进行编辑?我需要其他方法吗?

此外,我将如何更改这些子文件的权限?我是否必须每次在新女儿和源电子表格之间来回更改活动电子表格?

感谢您的帮助!

我在下面提供了我的脚本的副本:

function SpawnReports() {
  // gets the current Google Sheet file
  var parentFile = DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId())
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // the spreadsheet must have a sheet named ReportList with 
  // Column A = IDs and Column B = emails without headings on columns
  var sheet = ss.getSheetByName("ReportList");
  var data = sheet.getDataRange().getValues();
  // determines timezone
  var timeZone = Session.getScriptTimeZone();
  // generates the timestamp and stores in variable 
  // formattedDate as year-month-date hour-minute-second
  var formattedDate = Utilities.formatDate(new Date(), timeZone , "yyyy-MM-dd' 'HH:mm:ss");
  // gets the destination folder using parent spreadsheet location (folder)
  var parentFolder = parentFile.getParents();
  var folder = parentFolder.next();
  var folderId = folder.getId();
  var destination = DriveApp.getFolderById(folderId);

  // loops through IDs
  for (var i = 0; i < data.length; i++) {
    Logger.log('ID: ' + data[i][0]);
    Logger.log('EMAIL: ' + data[i][1]);

    // Write ID to daughter spreadsheet reference cell
    sheet.getRange(1, 3).setValue(data[i][0]);

    // gets the name of the original file and appends the ID and 
    // the timestamp stored in formattedDate
    var name = SpreadsheetApp.getActiveSpreadsheet().getName() + " - " + data[i][0] + " Report " + formattedDate;

    // makes copy of "parentFile" with "name" at the "destination"
    parentFile.makeCopy(name, destination);
  }
}

1 个答案:

答案 0 :(得分:1)

  

parentFile.makeCopy()是否仅按脚本运行之前的方式复制源电子表格,而不进行编辑?

是的。完成脚本后,Apps Script可能会等待应用更改。如果需要确定所做的更改是在复制之前应用的,请在复制之前使用SpreadsheetApp.flush()

  

我需要其他方法吗?

也许SpreadsheetApp.flush()还不够。另一种选择是将子电子表格ID / URL记录在某个地方,然后使用SpreadsheetAppopen(File)openById(fileId)方法来打开子电子表格。此时,您可以使用openByUrl(fileUrl)更新子电子表格中的相应单元格。

值得注意的是,Range#setValue()返回了一个引用新文件的file.makeCopy()对象。要获取其ID并打开子电子表格,可以使用以下内容:

File