簡體   English   中英

如何阻止 Google App Script 復制副本?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM