[英]How to time stamp when a cell was updated in Google Sheets using scripts?
[英]Function to timestamp when cell is updated Javascript | Sheets
當狀態放入列 C 時,我有一些代碼試圖創建時間戳。 狀態也由腳本更新/寫入。 當該狀態由腳本寫入時,它不會自動標記狀態。 有什么辦法可以改變這個嗎?
例如,如果我在它標記的狀態中寫“錯誤”,但如果腳本將其更改為錯誤,它不會標記。
function onEdit(e) {
var range = e.range;
var column = range.getColumn();
Logger.log('edited');
if (column == 3){
var timestamp = new Date();
var row = range.getRow();
var value = e.value;
var sheet = e.source.getActiveSheet();
Logger.log("edited cell: "+range.getA1Notation());
if( value == "queued"){
sheet.getRange(row, 8).setValue(timestamp);
} else if(value == "delivered"){
sheet.getRange(row, 10).setValue(timestamp);
} else if(value == "error"){
sheet.getRange(row, 9).setValue(timestamp);
}
}
}
解釋:
根據Simple Triggers , onEdit(e)
和onSelectionChange(e)
僅在用戶在工作表上進行交互時才起作用(例如,用戶單擊或編輯單元格)。 當工作表通過腳本或公式自動填充而沒有任何用戶交互時,這些簡單的觸發器將不會啟動。
話雖如此,我建議您將時間戳代碼放在腳本上,您可以將代碼自動添加到 C 列上。 這樣,在 C 列上添加的每個狀態上,也會自動添加時間戳。
供您參考,我在這里創建了一個測試表:
然后,我在下面創建了一個示例測試腳本,它將queued
添加到工作表中,然后是添加時間戳的代碼:
function AddStatus() {
var ss = SpreadsheetApp.openById("XXXXXXXXXXXXXX").getSheetByName('Sheet1');//Spreadhseet ID and the Sheet name where statuses will be added on column C
ss.getRange(ss.getLastRow()+1,3).setValue('queued');//sample code where status "queued" will be added on the lastrow of column c on Sheet1 on the Spreadsheet
var range = ss.getDataRange().getValues();//it gets all statuses that were added on column C
var timestamp = new Date();
for(var x = 1; x <= range.length; x++){//A loop to check every status on column C
var value = ss.getRange(x,3).getValue();//gets the status value on every row
if(value == 'queued' && ss.getRange(x, 8).getValue() == ''){//checks if the status value matches the condition and will only put timestamp if there's no existing one yet
ss.getRange(x, 8).setValue(timestamp);//sets the timestamp
}else if(value == 'delivered' && ss.getRange(x, 10).getValue() == ''){
ss.getRange(x, 10).setValue(timestamp);
}else if(value == 'error' && ss.getRange(x, 9).getValue() == ''){
ss.getRange(x, 9).setValue(timestamp);
}else if(value == ''){//checks emtpy rows in between statuses just in case there and logs the result
Logger.log('Empty value on row '+x);
}else{
Logger.log('Existing timestamp on row '+x);//skips and logs all rows on column C with existing timestamps to ensure timestamps are not overridden
}
}
}
運行腳本后, queued
在第 3 行添加了時間戳,如下面的測試表所示:
最后,這是執行日志:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.