在识别脚本实例的Apps脚本中

时间:2018-04-06 11:11:58

标签: google-apps-script

我正在使用应用脚本触发器让脚本在错综复杂的线程尝试中运行多次。

它的工作原理如下。当脚本运行时,它会设置触发器以每分钟运行相同的脚本,因此理论上您可以在6分钟超时之前同时运行5个实例。这实际上是有效的 - 不像我想的那样顺利,因为有时因为某些原因没有运行。

无论如何,我想知道有多少脚本随时都在运行并识别它们。我找不到脚本实例的标识符,尽管有一个脚本标识符,ScriptApp.getScriptId()

有没有办法识别实例?

1 个答案:

答案 0 :(得分:0)

您可以生成并存储随机字符串作为每次运行的标识符。这将让您计算正在运行的实例:使用PropertiesService注册运行是一种简单的方法。如果由于某种原因导致运行崩溃或被杀死,它将无法自行清理,因此为了安全起见,我们还可以使用计算活动运行的功能清除僵尸属性。

/**
 * Generate a random identifier from multiple common words
 */
function memorableIdentifier(len) {
  var tokens = 'able bad big case child company day different early eye' +
      'fact few first good government great group hand high important
      'large last life little long man new next number old' +
      'other own part person place point problem public right same' +
      'small thing time way week woman work world year young'.split(' ');
  var out = [];
  for (var i = 0; i < len; i++) {
    out.push(tokens[Math.floor(Math.random() * tokens.length)]);
  }
  return out.join('-');  // generates identifers like 'life-place-week'
}

/**
 * This is the function you trigger every minute
 */
function scriptTriggerHandler(e) {
  // Make a script property for this Uid's start
  var props = PropertiesService.getScriptProperties();
  var runIdentifier = memorableIdentifier(5);
  props.setProperty(runIdentifier, new Date());
  /**
   * DO ACTUAL STUFF HERE
   */
  props.deleteProperty(runIdentifier);
}

/**
 * Count script properties with plausibly recent timestamp values.
 * Also cleans up stale properties. Alter this if you use script
 * properties for other purposes.
 */
function countActiveRuns() {
  var TIMEOUT = 6 * 60 * 1000;  // Six minutes in milliseconds
  var active = 0;
  var now = new Date();
  var props = PropertiesService.getScriptProperties();
  var propKeys = props.getKeys();
  for (var i = 0; i < propKeys.length; i++) {
    var triggerUid = propKeys[i];
    var startTime = props[triggerUid];
    if (now - startTime > TIMEOUT) {
      // We have found a stale entry
      props.deleteProperty(triggerUid);
    } else {
      active += 1;
    }
  }
  return active;
}