1

В настоящее время я пытаюсь использовать Martin Hawksey от его blog, но я столкнулся с двумя проблемами.Менеджер событий Google Apps Script

# 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) Мой другой вопрос в шаблоне для присоединения инструкции я не могу назвать к любым переменным (т.е. $ { "Счет-фактура "} или $ {" 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

Любая помощь будет очень оценена, самая большая и самая важная вещь - это дата, хотя .... Спасибо

+0

Прохладный менеджер событий! Я смотрел видео. Интересный материал для сценариев G для приложений. Не знал. – powtac

+1

Да, это потрясающе, просто хочу, чтобы он работал на 100%, прежде чем использовать его. – hakarune

+0

Этот сценарий может использовать некоторую оптимизацию, уменьшая количество вызовов до 'setValue()' путем создания массивов и использования 'setValues ​​()' вместо этого. См. [Best Practices - Google Apps Script] (https://developers.google.com/apps-script/best_practices). – Mogsdad

ответ

5

Для проблемы № 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, он может предоставить более убедительный тест, если он работает в приложении-скрипте.

Для этого исправить ошибку 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; 
} 
+0

Спасибо, я дам это завтра! – hakarune

+0

Да, это исправляет проблему № 1 (СПАСИБО А LOT !!!), что действительно важно. Что касается вопроса № 2, это звучит как из того, что вы говорите, и чтения, что мне придется перекодировать почти все вокруг «isDate()», чтобы исправить это ... Я не думаю, что это в моей умение, честно говоря, я подумал, что было бы проще просто проверить **, если ** x - дата (формат req: ** mm/dd/yyyy tt: tt: tt **), затем «Date (sDate)» [ и что делать все это] ** еще ** не просто отправлять те же «NaN» данные из ячейки .... – hakarune

+1

@hakarune - Я добавил фрагмент кода, который должен сделать трюк. Это так просто, как вы описываете. Я тестировал его в apps-script, и он работает. Только переменные, которые уже являются объектами Date, будут отформатированы - это означает, что строка «22 февраля 2013» останется строкой, тогда как исходная версия превратит ее в дату. Тем не менее, я думаю, это должно позаботиться об этом для вас! – Mogsdad