2017-05-22 14 views
0

問題:スプレッドシートは入力された日付をDate()として認識しないため、Apps Scriptでその日付の.getTime()を取得できません。スプレッドシートアプリケーションの変換日付()

質問:これはなぜですか。

結果:ここに は、私が実行しているスクリプトの一部です:dates範囲を指し

dates.map(function(inp) { 
    if (inp != undefined && inp !== ""){ 
    inp = new Date(inp.getTime() - (date.getTimezoneOffset()*60000); 
    return inp 
    } 
}); 

dates = sheet.getRange(2,1, lastR, 1).getValues();

現在、この範囲は2017-」の手動inputed値を持っています05-20」日付が「Sat May 20 2017 00:00:00 GMT + 0200(CEST)」と自動的に認識される

0は、次のように表示されます:

TypeError: Cannot find function getTime in object Sat May 20 2017 00:00:00 GMT+0200 (CEST). (line 86, file "Code") Details Dismiss

Spreadsheetに入力値を日付としてオートコンバートすることを100万回試してみましたので、少なくともタイムスタンプや何かを作ることができます。誰がこれをやっているのか知っていますか?

答えて

3

getValues()を1列の範囲で呼び出しても、それでも配列の配列になります。

ここで紛らわしいのは、GASが役立つようにして、1要素配列に唯一の値を表示することです。

行から最初の要素を抽出すると、この問題が解決されます。

dates.map(function(row) { 
    var inp = row[0]; 
    if (inp != undefined && inp !== ""){ 
    inp = new Date(inp.getTime() - (date.getTimezoneOffset()*60000); 
    return inp 
    } 
}); 
+0

これは目標に向かって動作しますが、最終的な "日付"には更新された値が表示されないという問題が残ります... [17-05-22 19:06:50:561 CEST]土曜日5月20日02:00:00 GMT + 02:00 2017 [17-05-22 19:06:50:561 CEST] -7200000.0 [17-05-22 19:06:50:562 CEST] [[最初のログは "inp"、2番目のログはTimezoneOffset、3番目のログは最終の "dates"です。何が起こっているのか知っていますか? – nikooters

+0

私は通話なしでログを理解しています。再現可能な例を提供してもらえますか?日付はどこで定義されていますか? getTimezoneOffsetは時間ではなく分を返します。 –

+0

'var dates = sheet.getRange(2,1、lastR、1)。getValues(); (inp!= undefined && inp!== ""){ inp = new Date(inp.getTime() - (date(inp!== "")); dates.forEach(function(row、k){ var inp = row [k] .getTimezoneOffset()* 60000)); Logger.log(inp); return inp } }); Logger.log(date.getTimezoneOffset()* 60000); Logger.log(dates); ' – nikooters

0

Array.prototype.map()ですべてを行うことを強くお勧めする場合は、次のコードが有効です。私はあなたの日付操作ロジックを無視して、代わりにセルの日付に5日を追加しました。値を更新するには、Array.prototype.map()が返す値を変数に代入する必要があります。また、2つの別々の空の文字列をチェックし、「未定義」は、JavaScriptが実際にそれらの両方が「偽」であると考えて(残念ながら、これは同様に0に適用されますので、注意してください)冗長である

 function getDates() { 

      var ss = SpreadsheetApp.getActiveSpreadsheet(); 
      var sheet = ss.getSheets()[0]; 
      var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1); 
      var values = range.getValues(); 

      var newValues = values.map(function(row) { 

      var newRow = row.map(function(value){ 

      if (value){ 

      value = new Date(value.getTime() + 3600000*24*5) // adding 5 days 

      return value; 

     } 

    }); 

    return newRow; 

    }); 

    range.setValues(newValues); 


} 
+0

申し訳ありませんが、これは私が持っていた問題を解決しませんでした。お試しいただきありがとうございます – nikooters

+0

すべて私の側で働いているようです。たぶん問題を小さな質問に分割して別々に質問してみることもできます。 –

+0

"スプレッドシートは入力日付をDate()として認識しないため、Appsスクリプトで.getTime()を取得できません。 - これは私が持っていた唯一の問題であり、解決されました!私はデータが取り込まれている列を定義するのを忘れていたために存在していました:) – nikooters

0

私は取ってしまいました働いていたロビンの勧告、および以下のなかった、:

日付がグローバル date = new Date()、「行」にそれらのデータを持つ行として定義された
rows.map(function(r) { 
     r.day = new Date(r.day.getTime() - (date.getTimezoneOffset()*60000)); 
     r.day = r.day.toISOString().split('T')[0]; 
     return r 
     }) 

を、そして「一日」とは、第1行目の列名(あります私が変更しようとしていた日付の列については、前のスクリプトで定義していました。

もう一度おねがいします!