Диспетчер событий 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;
}
Другие вопросы по тегам