簡體   English   中英

在 Google Sheet Apps 腳本中以編程方式觸發 onChange 事件

[英]Trigger an onChange event programmatically in Google Sheet Apps Script

我有兩個電子表格(我稱它們為源和目標)。 Source 電子表格包含用戶插入的數據,這些數據使用'=IMPORTRANGE' function 導入到Destination 電子表格中,Source 中的更改只會反映在Destination 中。

在目標電子表格中,有兩個工作表(工作表 1 和工作表 2)。 工作表 2 包含從源電子表格導入的數據。 雖然最后添加到工作表 2 的數據將反映在工作表 1 上。您可能想知道為什么不直接導入工作表 1 中的數據而不是工作表 2,這是因為工作表 1 包含其他信息(由用戶手動添加),即不包含在導入的數據中。

這是我所做的,使用應用程序腳本我能夠反映/附加來自工作表 2 的數據到工作表 1,唯一的問題是事件觸發。 目前,該程序只有在我點擊Apps Script中的“運行”function時才會運行。 我想要發生的是,只要將新數據導入到工作表 2,就會立即觸發事件以將數據反映到工作表 1。

以下是工作表 2 的示例:工作表 2(目標)包含導入的數據:

第二項應該已經自動添加到工作表 1 但沒有,所以我仍然需要單擊“運行” function; '=IMPORTRANGE' function 在單元格 A2 中。

這是工作表 1 的樣子:

表 1(目的地)反映了表 2 中的數據

這是我的代碼(不包含 onChange 事件的任何算法):

const ss = SpreadsheetApp.openByUrl(url);
const ws = ss.getSheetByName("Sheet 1");

function myFunction() {
  const ss2 = SpreadsheetApp.openByUrl(url);
  const ws2 = ss2.getSheetByName("Sheet 2");
  const entryNo = ws2.getRange(ws2.getLastRow(), 1, ws2.getLastRow() - 1, 1).getValue();
  const companyNo = ws.getRange(ws.getLastRow(), 2, ws.getLastRow() - 1, 1).getValue();
  const company = ws2.getRange(ws2.getLastRow(), 2, ws2.getLastRow() - 1, 1).getValue();
  const firstName = ws2.getRange(ws2.getLastRow(), 3, ws2.getLastRow() - 1, 1).getValue();
  const surName = ws2.getRange(ws2.getLastRow(), 4, ws2.getLastRow() - 1, 1).getValue();
  const address = ws2.getRange(ws2.getLastRow(), 5, ws2.getLastRow() - 1, 1).getValue();
  const position = ws2.getRange(ws2.getLastRow(), 6, ws2.getLastRow() - 1, 1).getValue();
  const degree = ws2.getRange(ws2.getLastRow(), 7, ws2.getLastRow() - 1, 1).getValue();
  const dateHired = ws2.getRange(ws2.getLastRow(), 8, ws2.getLastRow() - 1, 1).getDisplayValue();

  const department = "";
  const schedule = "";
  const nextCompanyNo = companyNo + 1;

  const dataArray = [entryNo, nextCompanyNo, company, firstName, surName, Address, 
                                      department, position, schedule, degree, dateHired ];

  ws.appendRow(dataArray);
}

我添加了一些空變量,這樣我就可以對數組中的數據進行正確的索引(這就是我能想到的)。 稍后將手動編輯這些數據。

我確實嘗試通過分配屬性為 onChange 事件添加一些代碼。

function propertiesStuff(){

PropertiesService.getScriptProperties().setProperty("A2",SpreadsheetApp.getActive().getActiveSheet().getRange("A2").getValue());

}

但是我收到一條錯誤消息:

異常:參數 (String,number[]) 與 PropertiesService.Properties.setProperties 的方法簽名不匹配。

僅當在導入的數據范圍內添加新數據時,如何以編程方式觸發 onChange 事件? 電子表格上的任何其他更改,如手動編輯數據、刪除數據、添加行等,都不會觸發 onChange 事件。

您省略了一些代碼。 您發布的propertiesStuff function 使用setProperty ,但您的錯誤與setProperties的調用有關。

根據文檔setProperties有兩個參數:第一個是key: value對的object ,第二個是可選的 boolean,標記是否應刪除其他屬性。

如果您使用的是setProperties ,那么它應該看起來像這樣:

PropertiesService.getScriptProperties().setProperties({
  "A2": SpreadsheetApp.getActive().getActiveSheet().getRange("A2").getValue()
})

如果您想使用setProperty ,那么您的行是正確的,但您運行的是另一個 function,它會引發錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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