谷歌Apps脚本事件管理器(Google Apps Script Event Manager)

2019-08-17 01:27发布

我目前正试图用马丁Hawksey对谷歌Apps的事件管理器从他的博客 ,但我遇到了两个问题。

#1)的构象电子邮件的日期发布了“今天的”日期和时间,而不是事件的日期和时间(这是在他原来和他从来没有固定的话)。 大多数都在说有这部分不是正确的事情:

    var variableData = isDate(data[normalizeHeader(templateVars[i])]);
    email = email.replace(templateVars[i], variableData || "");
  }

  return email;
}

// Test if value is a date and if so format 
function isDate(sDate) {
  var scratch = new Date(sDate);
  if (scratch.toString() == "NaN" || scratch.toString() == "Invalid Date") {
    return sDate;
  } 
  else {
    return Utilities.formatDate(new Date(), TZ, "dd MMM yy HH:mm");
  }
}

#2)我的另一个问题是在模板加盟说明我不能叫,任何变量(如$ {“发票”}或$ {“金额”} ::而是返回“今天”日期< -我增加了更多的细胞,并添加一列每个并且他们在他们拥有的数据,并提出在脚本正确的调整,仍然一无所获。

恩。

Template: "Your Invoice # is: ${"Invoice"} and your total amount due is: ${"Amount"}"
Reality: "Your Invoice # is: 13 Feb 13 13:18 and your total amount due is: 13 Feb 13 13:18."

这是我的完整剧本,我所做的更改(从他原来也差不太多): https://gist.github.com/hakarune/4985606

任何及所有的帮助将是非常赞赏,最大和最重要的是,虽然日子....谢谢您

Answer 1:

对于问题#1,为评论isDate()函数说,如果给定的sDate是一个有效的日期,该日期的格式化版本将被退回。 但调用formatDate()通过new Date()这将是当前的日期和时间。 相反,它应该通过new Date(sDate)

return Utilities.formatDate(new Date(sDate), TZ, "dd MMM yy HH:mm");

对于问题#2,貌似问题再次isDate()fillInTemplateFromObject()函数是调用isDate()如果它是一个日期格式化模板数据,期待它会保持原样,否则。 问题是, 每一个数字会通过isDate()检查,因为测试是根本就不管new Date(sDate)将生产日期。 请参见本参考 ,你会看到,它最终会被当作new Date(milliseconds) 。 你得到当前的日期,因为上述错误的......解决这个问题,你会得到一个不同的日期,但仍然是一个日期。 检查检测在JavaScript中“无效的日期” Date实例 ,它可提供更确凿的测试,如果它工作在应用程序脚本。

这里有一个固定isDate()您可以尝试。 它包括问题#1的修复,并在拉isValidDate()从日常工作中的JavaScript检测“无效的日期” Date实例 ,以日期和数字之间更准确的区分。

// From https://stackoverflow.com/questions/1353684
// Returns 'true' if variable d is a date object.
function isValidDate(d) {
  if ( Object.prototype.toString.call(d) !== "[object Date]" )
    return false;
  return !isNaN(d.getTime());
}

// Test if value is a date and if so format
// otherwise, reflect input variable back as-is. 
function isDate(sDate) {
  if (isValidDate(sDate)) {
    sDate = Utilities.formatDate(new Date(sDate), TZ, "dd MMM yy HH:mm");
  }
  return sDate;
}

如果你很好奇,这是测试代码我在调试器中运行。 中的注释说明什么显示在调试器值。

var TZ = "GMT"; // isDate() uses a global variable for TimeZone, let's try GMT

function myFunction() {
  var a = new Date();     // Fri Feb 22 2013 20:48:07 GMT-0500 (EST)
  var b = isDate(a);      // "23 Feb 13 01:48"
  var c = 142312;         // 142312.0
  var d = isDate(c);      // 142312.0
  var e = 'test string';  // "test string"
  var f = isDate(e);      // "test string"
  var g = 'Feb 22, 2013'  // "Feb 22, 2013"
  var h = isDate(g);      // "Feb 22, 2013"
  debugger;
}


文章来源: Google Apps Script Event Manager