我有一個作業表,其中設定了一個時間觸發器,每30分鐘運行一次。當觸發器發生時,一個函式被執行,它將在作業表的底部添加一個帶有一些資料的新行。 在A列,我有日期。
現在的問題是,谷歌的觸發器工具有時會錯誤地連續執行3次或更多,而每次執行之間的間隔不到1分鐘。這種情況經常發生,我需要一種方法來解決這個問題。
我寫了一些代碼,據說如果最后一行與第二行或前一行之間的差異小于30分鐘,就會洗掉新記錄的行。這樣一來,所有的行將總是相互之間相差30分鐘。
我被卡住了。
我在這一點上卡住了,我想不出有什么辦法可以讓Google Script根據我的條件來比較2個日期并回傳TRUE或FALSE,也就是檢查2個日期之間的差異是否大于/等于或小于30分鐘,如果小于,就洗掉該行,否則什么都不做。事實上,我給這個條件留了1分鐘的余地,因為觸發器不是100%精確的,并不總是在同一秒發生。
變數timerDifference回傳NaN。
我懷疑這可能是因為日期格式的問題?
這是我的代碼。
這是我的代碼ATM:
function deleteTriggerError(){
let logSheetName = "LOG"/span>;
let logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(logSheetName)。
let lastRowTimer = logSheet.getRange(logSheet. getLastRow(), 1).getValue() 。
let secondLastRowTimer = logSheet.getRange(logSheet. getLastRow() - 1, 1).getValue()。
console.log(lastRowTimer)。
console.log(secondLastRowTimer)。
let dysLast = Utilities.formatDate(lastRowTimer, timeZone, 'dd/mm/yyyy hh:mm:ss') 。
let dysSecondLast = Utilities.formatDate(secondLastRowTimer, timeZone, 'dd/mm/yyyy hh:mm:ss') 。
console.log(dysSecondLast)。
console.log(dysLast)。
let timerDifference = dysLast - dysSecondLast;
console.log(timerDifference)。
let timerDifLimitRange = SpreadsheetApp.getActiveSpreadsheet() 。 getSheetByName(logSheetName).getRange("H3"/span>)。
let timerDifLimitValueTXT = timerDifLimitRange.getValue()。
let timerDifLimitValue。
//console.log(timerDifference);
timerDifLimitValue = timerDifLimitValueTXT.replace("3 0 M I N U T E S", 30 - 1) 。
logSheet.appendRow(["])。
if (timerDifference < timerDifLimitValue) {
logSheet.deleteRow(logSheet.getLastRow()) 。
// console.log("TRUE");
} else {
// console.log("FALSE"); {
}
我試了一下我在這里看到的解決方案。 兩個時間之間的時間差在js中顯示錯誤的值
var diff = Math. abs(new Date('01/23/2020 06: 30 PM') - new Date('01/23/2020 05:00 AM') )。
var minutes = Math.floor( (diff/1000)/60)。
alert(分鐘)。
這個解決方案只適用于en_US日期格式。但我使用的是en_GB日期格式:21/09/2021 14:44:38。有什么原因嗎?
你可以檢查:
var diff = Math. abs(new Date('01/23/2020 06。 30 PM') - new Date('01/23/2020 05:00 AM') )。
console.log(diff)。
var minutes = Math.floor( (diff/1000)/60) 。
console.log(分鐘)。
var diff = Math。 abs(new Date('21/09/2021 14。 44:38') - new Date('21/09/2021 14:04:38') )。
console.log(diff)。
var minutes = Math.floor( (diff/1000)/60) 。
console.log(分鐘)。
var diff = Math。 abs(new Date('09/21/2021 14。 44:38') - new Date('09/21/2021 14:04:38') )。
console.log(diff)。
var minutes = Math.floor( (diff/1000)/60) 。
console.log(minutes);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
謝謝你的時間。
我的檔案。 https://docs.google.com/spreadsheets/d/1ExXtmQ8nyuV1o_UtabVJ-TifIbORItFMWjtN6ZlruWc/edit?usp=sharing
uj5u.com熱心網友回復:
Date()不支持dd/mm/yyyy。這可以防止像1/2/2014這樣的情況產生歧義,即產生兩個可能的日期,1月2日和2月1日。 所以它只支持mm/dd/yyyy作為其標準格式。
正確轉換的一種方法是分割日期。
function myFunction(){
startDate = '21/09/2021 14:44:38'。
endDate = '21/09/2021 14:04:38';
var diff = Math. abs(convertGBDatetoDate(startDate) - convertGBDatetoDate(endDate))。
console.log(diff)。
var minutes = Math.floor( (diff/1000)/60) 。
console.log(分鐘)。
}
function convertGBDatetoDate(string){
var [sD, sM, sY] = string.split(' '/span>)[0]。 split('/')。 map(i=>Number(i))。
var [sh, sm, ss] = string.split(' ')[1] 。 split(' :')。 map(i=>Number(i))。
return new Date(sY,sM - 1,sD,sh, sm,ss);
}
uj5u.com熱心網友回復:
有人在上面評論,但后來洗掉了,要使用getTime()。
在這里閱讀。
因此,我認為這很有效。我甚至不需要擔心日期格式問題。我只需要用getRange()和getValue()獲得范圍。然后我就可以使用這個簡單的代碼:
var end, start;
start = new Date("Tue Sep 21 2021 20:00:00 GMT 0100(英國夏日時間)")。
end = new Date("Tue Sep 21 2021 20:33:17 GMT 0100 (British Summer Time)")。
console.log('operation took ' ((end. getTime() - start.getTime())/1000)/60) ' min');
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/330535.html
標籤:
下一篇:轉移的內容問題
