我正在使用 google sheet 作為主資料庫。資料被發送并存盤到用戶可以與之互動的 2 張作業表中。用戶也可以修改資料。目標是跟蹤 2 張作業表中的所有更改并將更改復制到另一張作業表。如果修改了作業表 1,則編輯的行將被復制到歷史作業表 1,作業表 2 也是如此。復制資料時,將附帶時間戳和修改作業表的用戶 ID。
我的問題是,在檢索行范圍時,它是未定義的。
這是我的代碼:
function onEdit(e){
var timeStamp = Utilities.formatDate(new Date(), "GMT 8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var row = e.range.getRow();
var rowRange = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
if(sourceSheet.getSheetName() == 'Sheet1'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
targetSheet.appendRow([timeStamp,userID,rowValues]);
} else if(sourceSheet.getSheetName() == 'Sheet2'){
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([timeStamp,userID,rowValues]);
}
}
uj5u.com熱心網友回復:
試試這個:
function onEdit(e){
const ts = Utilities.formatDate(new Date(), "GMT 8", "hh:mm:ss dd MMMM yyyy")
const uid = Session.getActiveUser().getUserLoginId();
const sh = e.range.getSheet();
const rg = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn());
const vs = rg.getValues()[0];
if(sh.getSheetName() == 'Sheet1'){
let tsh = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
tsh.appendRow([ts,uid,vs]);
} else if(sh.getSheetName() == 'Sheet2'){
let targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
targetSheet.appendRow([ts,uid,vs]);
}
}
uj5u.com熱心網友回復:
從The onEdit works now based on this link. the issue now that the timestamp, the userid are append but the values is in form of [Ljava.lang.Object;@34c3ed94 in a cell only. The values aren't append to the rest of the row. 您的回復中,我了解到您的問題My issue is that when retrieving the row range, it is undefined.已經解決。
關于您當前的問題,我認為您的問題的原因是由于rowValues是一個陣列。那么在這種情況下,下面的修改呢?
修改后的腳本:
function installedOnEdit(e) {
var timeStamp = Utilities.formatDate(new Date(), "GMT 8", "hh:mm:ss dd MMMM yyyy")
var userID = Session.getActiveUser().getUserLoginId();
var sourceSheet = e.range.getSheet();
var rowRange = sourceSheet.getRange(e.range.rowStart, 1, 1, sourceSheet.getLastColumn());
var rowValues = rowRange.getValues()[0];
var obj = { "Sheet1": "HistoricalSheet 1", "Sheet2": "HistoricalSheet 2" };
var sheetName = sourceSheet.getSheetName();
if (!obj[sheetName]) return;
var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName(obj[sheetName]);
targetSheet.appendRow([timeStamp, userID, ...rowValues]); // targetSheet.appendRow([timeStamp, userID, rowValues.join(",")]);
}
- 在此修改中,使用用于搜索作業表名稱的物件將編輯的行放入另一個電子表格中的規范作業表中。通過這個,我認為腳本可以簡單一點。
- 并且,通過
targetSheet.appendRow([timeStamp, userID, ...rowValues]),將編輯的行放入一行。 - 如果要將行值放在一個單元格中,請修改為
targetSheet.appendRow([timeStamp, userID, rowValues.join(",")]).
筆記:
- 在此修改中,我將函式名稱從 修改
onEdit為installedOnEdit。因為在SpreadsheetApp.openById使用時,需要使用可安裝的 OnEdit 觸發器。但是,當可安裝的 OnEdit 觸發器安裝到函式onEdit時,onEdit由簡單觸發器和異步行程的可安裝觸發器運行。所以,我修改了函式名。所以,請將可安裝的 OnEdit 觸發器安裝到函式installedOnEdit中,然后再次測驗。
參考:
- 傳播語法 (...)
- 加入()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/466578.html
