我目前正在尝试使用马丁·霍克西(Martin Hawksey)的Google Apps event managerblog,但遇到了两个问题。

#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”} ::而是返回“今天”的日期
例如

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

任何帮助都将不胜感激,最大和最重要的事情是那个日期....谢谢

最佳答案

对于问题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)是否会产生日期。参见this reference,您将看到它最终将被视为new Date(milliseconds)。由于上述错误,您正在获取当前日期。解决此问题,您将获得一个不同的日期,但仍然是一个日期。选中Detecting an "invalid date" Date instance in JavaScript,如果它可以在apps-script中运行,则可以提供更确定的测试。

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

// 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;
}

关于javascript - Google Apps脚本事件管理器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14958334/

10-08 23:44