GAS(Google Apps Script)で、日付をonEdit()で扱う時、スマホとPCで扱えるデータが変わるという話
こんばんは。連続投稿になりますが、がーーっと作ってがーーっとまとめたかったので。
とりあえずタイトルの件です。
GASでSpreadSheetを扱う時、以下のような onEdit(e)
関数を使って、セルが編集されたときにいろいろやりたい需要があると思います。
// onEdit(e)関数は、シートが編集されたときに動くコールバック関数 function onEdit(e) { const value = e.value; if(value == 1) { //何らかの処理 } }
まぁこの使い方とか、これでできることはいろんな方が記事にしているのでそちらを参照していただいて、問題は、「スマホとPCでとれる値が違うことがある」という点です。
前提として、SpreadSheetでは、データの入力規則を日付にすることで、日付を入力するためのカレンダーを表示する機能があります(Androidアプリ、およびWebのみ=iOSアプリは非対応)。
こんな感じです。
んで、これは(iPhoneの人はすみませんが)結構便利なんですけど、実はこのカレンダー上から選択したときに、 onEdit()
関数にわたる値がスマホアプリとWebでは違いがあります。
具体的には以下のコードを書いてみます。
function onEdit(e) { const row = e.range.getRow(); const column = e.range.getColumn(); const value = e.value; if(column == 1) { SpreadsheetApp .getActiveSheet() .getRange(row,2) .setValue(value); } }
こうすると、日付を選択するカラムの隣に、変更後に onEdit()
にわたったデータが格納されます。
で、これを実行してみると。。。。
んん??? 44639
??なんだろう。。。UNIXタイムにしては値が小さすぎるし、かといって何か思い当たる節もない。。。
というわけで調べたところ、6年前のQiitaのこちらの記事が。。。。
この記事によると、 Excelで使われている「1899年12月30日午前0時からの経過日数」 なのだそう。そうだったんだ知らなかった。。。(仕事でExcel使ってるのに)
ちなみに、javascript標準の Date
オブジェクトに食わせるには、エポックミリ秒である必要があるので、その時はこの方の記事と同じように (<シリアル値> - 25569) * 86400000
とすると、エポックミリ秒に直るみたいです。
で、まぁPCでカレンダーから選択すると、シリアル値が取れるのはわかったと。これをスマホから選択するとどうなるか。
こんな感じで、何も値が挿入されてくれません。こんな感じで、スマホからカレンダーを経由して選択した場合には、 onEdit()
関数内では何も取得できないのです。
これをどう扱うかは、開発者や意思決定者によると思いますが、頭に留めておいてください。
まとめ
- スマホからカレンダーで日付を選んだ時 → 何も取得できない
- PC(Web)からカレンダーで日付を選んだ時 → 「1899年12月30日午前0時からの経過日数」であるシリアル値
というわけです。皆さん気を付けてください。
では、ごきげんよう。