Google App脚本触发器ID格式

时间:2016-08-20 17:58:48

标签: javascript google-apps-script google-apps

我正在开发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?


感谢

6 个答案:

答案 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脚本:

&#13;
&#13;
// 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;
&#13;
&#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)

以下是来源: https://teamtreehouse.com/community/covert-scientific-notation-within-variable-to-javascript-number-when-scientific-notation-is-yet-unknown

我希望这对某人有帮助!