我正在开发Google Spreadsheet的项目,我正在通过脚本添加/删除TimeBased触发器。
所有触发的触发器都将运行一个函数,该函数将相应地检查其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);
}
此时,我以这种格式获得了触发器ID&#;; 6.29589E + 18'
如果我尝试使用toString()方法更改格式,格式将更改为' 6295890543675973000'
我无法将格式化为我保存的ID。
任何想法我怎么能以添加触发器时的格式返回id?
感谢
答案 0 :(得分:2)
我在这上花了几个小时,脱掉了一些头发。 我找到了this page。当你在其中传递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 :(得分: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 :(得分:1)
当您使用getUniqueId()
方法请求触发器对象的id时,返回的值是数字 String 。
但是,当触发器调用函数时,事件对象的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
这里&#39; s a note关于严格的vs. Javascript中的标准比较操作。
这是一些展示以上所有内容的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);
}
}
&#13;
答案 3 :(得分:0)
Logger.log('' + triggerId);;;;
答案 4 :(得分: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);
}
答案 5 :(得分:0)
我有同样的问题。最适合我的解决方案是:toPrecision([numberOfDigits])
。
例如:
([largenumber]).toPrecision(27)
我希望这对某人有帮助!