Диспетчер событий Google Apps Script
В настоящее время я пытаюсь использовать менеджер событий Служб Google Мартина Хокси из его блога, но у меня две проблемы.
# 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
Любая помощь будет очень цениться, самая большая и самая важная вещь, хотя эта дата.... Спасибо вам
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)
, Вы получаете текущую дату из-за ошибки, описанной выше... исправьте это, и вы получите другую дату, но все же дату. Отметьте Обнаружение экземпляра Date "недопустимая дата" в JavaScript, он может обеспечить более убедительный тест, если он работает в apps-script.
Вот исправление isDate()
для вас, чтобы попробовать. Он включает в себя решение проблемы № 1 и тянет в isValidDate()
подпрограмма от Обнаружения "недопустимой даты" Экземпляр даты в JavaScript, чтобы более точно различать даты и числа.
// From https://stackru.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;
}