2016-08-20 46 views
1

我正在使用Google Spreadsheet的項目,在其中通過腳本添加/刪除基於TimeBased的觸發器。Google應用腳本觸發器ID格式

所有觸發器都會運行一個函數,它將檢查它的ID並相應地運行函數。

我保存開始觸發器並使用此代碼保存它的ID。

function startTimer(rn) { 
    var triggerid = ScriptApp.newTrigger('mainFunction') 
     .timeBased() 
     .everyMinutes(1) 
     .create().getUniqueId(); 

    SpreadsheetApp.getActiveSheet().getRange(1, 8).setValue(triggerid); 
} 

此功能節省的觸發id在格式「6295890543675972447」

現在,當觸發器被觸發並運行功能「mainFunction」。 使用此代碼我試圖獲得觸發器的ID。

function mainFunction(e) { 
    var triggerId = e.triggerUid; 
    Logger.log(triggerId); 
} 

在這一點上,我得到這個格式 '6.29589E + 18' 的觸發ID
如果我嘗試改變與toString()方法的格式,該格式更改爲 '6295890543675973000'

我無法匹配格式與我保存的ID。

任何想法如何獲得身份證回格式是添加觸發器時?


由於

回答

0
Logger.log('' + triggerId);;;; 
0

作爲triggerId是Number對象,因此它被自動轉換爲指數表示法。

要處理此問題,您可以擴展Number.prototype以處理正確的表示形式。

Object.defineProperty(Number.prototype, 'toLongString', { 
    value: function() { 
    var parts = this.toString().split("e+"); 
    var first = parts[0].replace('.', ""); 
    var zeroes = parseInt(parts[1], 10) - (first.length - 1); 

    var longString = first; 

    for (var i = 0; i < zeroes; i++) { 
     longString += "0"; 
    } 

    return longString; 
    } 
}); 

function mainFunction(e) { 
    var triggerId = e.triggerUid.toLongString(); 
    Logger.log(triggerId); 
} 
1

觸發ID可以是一個大的數字(長8字節整數,或存儲作爲對象的更大數量),來克服這個問題,將其轉換爲二進制,然後到64位編碼的字符串。這樣你可以安全地存儲和比較。

var v = Utilities.base64Encode(Utilities.newBlob(e.triggerUid).getBytes()) 

或比較

if(Utilities.base64Encode(Utilities.newBlob(e.triggerUid).getBytes()) === Utilities.base64Encode(Utilities.newBlob(triggers[i].getUniqueId()).getBytes())) 
2

我花了一些這方面的時間,得到了一些頭髮掉。我發現了它有一段代碼,當你把它傳遞e.triggerUid是奇怪的工作,而不是直接使用它的時候:

function getFileByTriggerId(triggerId){ 
    var triggers = ScriptApp.getProjectTriggers(); 
    for(var i =0; i<triggers.length; i++){ 
    if(triggers[i].getUniqueId() == triggerId){ 
     return triggers[i].getTriggerSourceId(); 
    } 
    } 
} 

希望這將幫助別人

1

當您請求觸發對象的ID使用其getUniqueId()方法,返回的值是數字字符串

但是,當一個函數被觸發器調用時,事件對象的triggerUid屬性將被該字符串轉換爲號碼

問題是,字符串id 通常是(但並非總是)表示一個大於Apps Script可以安全處理的最大整數值的整數值。發生這種情況時,從字符串到數字的轉換會導致最低有效位數爲零。

因此,爲了正確比較兩者,您只需將字符串ID轉換爲數字即可,這將確保相同的歸零。

someTrigger.getUniqueId() === event.triggerUid 
// false - because the left side is a string, and the right is a number. 

Number(someTrigger.getUniqueId()) === event.triggerUid 
// true - both sides are now numbers, the same number 

someTrigger.getUniqueId() == event.triggerUid 
// true - because using the standard comparison operator the string is automatically converted to a number in the background 

這裏是a note關於嚴格v.s. Javascript中的標準比較操作。

下面是一些Google Apps腳本演示了上述所有的:

// Run onceOffClockTimer() and wait up to 1 min for the event to fire, then check your log. You might have to run it a few times to see a trigger id where the zeroing occurred 
 

 
function onceOffClockTimer() { 
 
    var newTriggerId = ScriptApp.newTrigger('timerCallbackFn') 
 
    .timeBased() 
 
    .after(5000) 
 
    .create() 
 
    .getUniqueId(); 
 
} 
 

 

 
function timerCallbackFn(triggerEvent) { 
 

 
    var eventTriggerId = triggerEvent.triggerUid, 
 
    triggers = ScriptApp.getProjectTriggers(); 
 
    Logger 
 
    .log('### Event Object ###') 
 
    .log('id: %s', eventTriggerId) 
 
    .log('id type: %s', typeof eventTriggerId) 
 
    .log('id as String: %s\n', eventTriggerId.toString()); 
 

 
    var largestSafeInteger = 9007199254740991; // Obtained by Number.MAX_SAFE_INTEGER in a Chrome console 
 

 
    Logger 
 
    .log('### Interesting Fact ###') 
 
    .log('In Apps Script the largest safe integer is: %s\n', largestSafeInteger); 
 

 
    for (var i = 0, x = triggers.length; i < x; i++) { 
 

 
    var triggerID = triggers[i].getUniqueId(); 
 

 
    Logger 
 
     .log('### Trigger Object [%s] ###', i) 
 
     .log('id: %s', triggerID) 
 
     .log('id type: %s', typeof triggerID) 
 
     .log('id as Number: %s\n', Number(triggerID)) 
 

 
    Logger 
 
     .log('### Comparisons ###') 
 
     .log('Strict (Trigger Event ID === Trigger ID) is %s ', eventTriggerId === triggerID) 
 
     .log('Strict (Trigger Event ID === Trigger ID as Number) is %s', eventTriggerId === Number(triggerID)) 
 
     .log('Direct (Trigger Event ID == Trigger ID) is %s', eventTriggerId == triggerID); 
 
    } 
 
}

相關問題