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"})を呼び出すことができません::代わりに、「今日の」日付を返します<--私さらにセルを追加し、それぞれに列を追加し、それらにデータがあり、スクリプトで正しい調整を行いましたが、まだ何もありません。

元。

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()渡されます。new Date()代わりに、合格する必要がありnew Date(sDate)ます。

return Utilities.formatDate(new Date(sDate), TZ, "dd MMM yy HH:mm");

問題#2については、問題が再びあるようisDate()です。fillInTemplateFromObject()関数はisDate()、日付の場合はテンプレート データをフォーマットするために呼び出しており、それ以外の場合はそのまま残されることを期待しています。問題は、テストは単に日付を生成するかどうかであるため、すべての数値がチェックに合格することです。この参照を参照してください。最終的には として扱われることがわかります。上記のバグのために現在の日付を取得しています...これを修正すると、別の日付が取得されますが、日付は変わりません。Detecting an "invalid date" Date instance in JavaScriptを確認してください。apps -script で機能する場合は、より決定的なテストが提供される可能性があります。isDate()new Date(sDate)new Date(milliseconds)

isDate()試してみるための修正方法は次のとおりです。これには、問題 #1 の修正が含まれており、日付と数値をより正確に区別するために、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;
}
于 2013-02-21T06:09:04.003 に答える