0

我目前正在尝试使用 Martin Hawksey 博客中的Google Apps事件管理器,但我遇到了 2 个问题。

#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)我的另一个问题是在加入指令的模板中我不能调用任何变量(即 ${"Invoice"} 或 ${"Amount"} :: 相反它返回“今天的”日期 <-- I添加了更多单元格并为每个单元格添加了一列,其中包含数据,并在脚本中进行了正确调整;仍然没有。

前任。

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

任何和所有的帮助都将非常感激,最大和最重要的事情是那个日期......谢谢你

4

1 回答 1

4

对于问题 #1,isDate()函数的注释说,如果给定sDate的日期是有效日期,则将返回该日期的格式化版本。但是调用formatDate()pass 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). 由于上述错误,您获得了当前日期......修复它,您将获得一个不同的日期,但仍然是一个日期。检查Detecting an "invalid date" Date instance in JavaScript,如果它在应用程序脚本中工作,它可能会提供更确凿的测试。

这是isDate()您尝试的解决方法。它包括对问题 #1 的修复,并isValidDate()Detecting an "invalid date" Date instance in JavaScript中引入例程,以更准确地区分日期和数字。

// 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;
}
于 2013-02-21T06:09:04.003 回答