[英]How to stop Google App Script is duplicating copies?
我希望有人可以幫助我編寫我正在嘗試編寫的腳本。
我正在嘗試編寫一個腳本,以便在我們的 google 工作表中添加新行時,它將復制模板電子表格並將鏈接粘貼到相應的列中。 當有新人注冊時,工作表會自動更新。
下面的腳本可以復制模板表,根據 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]))
})
}
您能給我的任何幫助將不勝感激:)
注意:您的帖子包含多個問題,這在 stackoverflow 中是不可取的,因為每個問題都應該只討論一個特定問題。 這個答案只會解決第一個問題How to stop Google App Script is duplicating copies? 至於第二個問題,請為它提交一個單獨的 stackoverflow 問題。
您的主要目標是復制電子表格的一個唯一模板,並將其鏈接粘貼到與工作表文件中新插入/添加的行相鄰的相應列(示例腳本中的第 20 列)中,每次您的 API 插入新用戶簽名時上信息。
我建議使用Time-driven installable trigger 。 這樣,您將能夠運行一個腳本(例如,每隔幾分鍾/小時或一天中的時間),該腳本將捕獲工作表中由 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
函數來啟動進程。 這會將當前的最后一行存儲在您的工作表中。captureNewRow
函數創建一個時間驅動的觸發器(在我的測試中,我每分鍾運行一次):captureNewRow
函數運行並將模板文件的副本添加到與新行相鄰的第20列:captureNewRow
函數也可以處理它們,如下所示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.