我正在尝试编写一个脚本,以便当新行添加到我们的谷歌工作表时,它将复制模板电子表格并将链接粘贴到相应的列中。当新人注册时,该表会自动更新。
下面的脚本可以复制模板表,根据 A 行中的相邻文本对其进行重命名,然后将链接粘贴到第 20 列中。
不幸的是,每次运行时,它都会为工作表中的所有行创建新工作表,而不是仅仅查找最新行并创建 1 个新工作表。
此外,我想将新共享电子表格的共享权限设置为特定组,而不是任何知道链接的人。
////function copyTo() {
// var tempsheet = SpreadsheetApp.openById("1q....");
//var mastersheet = tempsheet.getSheetByName("Setting Sheet");
//var lrow = mastersheet.getLastRow();
//for (i= 2; i<lrow; i++ ) {
//let names = mastersheet.getRange(i,1).getValues();
//sheet = tempsheet.copy(names);
//}
//}
//function createSpreadsheet(){
//var tempsheet = '1....';
//var sheetName = "MASTER"
//SpreadsheetApp.openById(tempsheet).copy(sheetName);
//for (r=2; r<lrow; r++) {
//let name = ss.getRange(r,1).getValue();
function cloneGoogleSheet(fileName) {
var destFolder = DriveApp.getFolderById("19Q....");
var newFile = DriveApp.getFileById("1vvgD....").makeCopy(fileName, destFolder);
return newFile.getUrl();
}
function createSheets() {
var workBook = SpreadsheetApp.getActiveSpreadsheet();
var sheet = workBook.getSheetByName("Sheet1")
var data = sheet.getRange("A2:A" + sheet.getLastRow()).getValues()
data.forEach((row, index) => {
sheet.getRange(index + 2, 20).setValue(cloneGoogleSheet(row[0]))
})
}
您的主要目标是每次复制电子表格的一个独特模板并将其链接粘贴到与工作表文件中新插入/添加的行相邻的相应列(示例脚本中的第 20 列)您的 API 插入新用户注册信息。
我建议使用时间驱动的可安装触发器。这样,您将能够运行一个脚本(例如,每分钟/小时或一天中的每个时间),该脚本将捕获您的工作表中由 API 更新的新数据行。
有关更多上下文,这里有一个针对此实现的调整脚本及其演示如下。
var workBook = SpreadsheetApp.getActiveSpreadsheet();
var sheet = workBook.getSheetByName("Sheet1");
function storeLastRow() { //Run this once here in the editor to kickstart the whole script
try {
const scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('LAST_ROW', sheet.getLastRow());
const recentRow = scriptProperties.getProperty('LAST_ROW');
console.log("Last Row recorded: "+ recentRow); //LOG FOR TRACKING
} catch (err) {
Logger.log('Failed with error %s', err.message);
}
}
function captureNewRow() {
const scriptProperties = PropertiesService.getScriptProperties();
const recentRow = scriptProperties.getProperty('LAST_ROW');
createSheets(parseInt(recentRow));
storeLastRow(); //This will auto-store the new last row on your script for the next time trigger
}
function createSheets(recentRow) {
console.log("LAST ROW RECORDED: "+recentRow+"\nCURRENT LAST ROW: "+sheet.getLastRow()); //LOG FOR TRACKING
for(var i = recentRow; i < sheet.getLastRow(); i++){ //Loop through the new rows one-by-one and save a dedicated copy per new rows
var filename = sheet.getRange((i+1),1).getValue();
sheet.getRange((i+1), 20).setValue(cloneGoogleSheet(filename))
console.log("Done processing new row #"+ (i+1)); //LOG FOR TRACKING
}
}
function cloneGoogleSheet(fileName) {
var destFolder = DriveApp.getFolderById("1VaI...");
var newFile = DriveApp.getFileById("1oJ2...").makeCopy(fileName, destFolder);
return newFile.getUrl();
}
storeLastRow
函数once来启动该过程。这将存储工作表中当前的最后一行。captureNewRow
函数创建一个时间驱动的触发器(在我的测试中,我每分钟运行一次):captureNewRow
函数运行并将模板文件的副本添加到与新行相邻的第 20 列:
captureNewRow
函数也可以处理它们,如下所示: