我需要有关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);
}
}
答案 0 :(得分:1)
parentFile.makeCopy()
是否仅按脚本运行之前的方式复制源电子表格,而不进行编辑?
是的。完成脚本后,Apps Script可能会等待应用更改。如果需要确定所做的更改是在复制之前应用的,请在复制之前使用SpreadsheetApp.flush()
。
我需要其他方法吗?
也许SpreadsheetApp.flush()
还不够。另一种选择是将子电子表格ID / URL记录在某个地方,然后使用SpreadsheetApp
,open(File)
或openById(fileId)
方法来打开子电子表格。此时,您可以使用openByUrl(fileUrl)
更新子电子表格中的相应单元格。
值得注意的是,Range#setValue()
返回了一个引用新文件的file.makeCopy()
对象。要获取其ID并打开子电子表格,可以使用以下内容:
File