GASからJSに配列を渡すことができない件 【解決済み】
超イライラしました。これで2時間無駄にしました。
こっちでプログラミング関連の記事を書くのは初めてかもしれません。本当はQuitaとかに書いたほうがいいんでしょうが、なんとなく敷居が高い気がするのでこっちに吐き出しておくことにしました。
というかこれちょっと理不尽です。私の知識が足りないだけで実は常識なのかもしれませんが、もし不具合ならさっさと修正してほしいところですね。不具合じゃなければ初心者がなんかぼやいてるとか思って生暖かい目で見てあげてください。
何が起こったのか
まずは、Googleフォームで入力されたデータをスプレッドシートに記録するようにした後、gasでそのスプレッドシートの中身を配列として取得し、それを加工してできた配列をJSに渡そうとしたところ、明らかにおかしい値が返ってきました。
元はだいたいこんな感じの配列です。
[ タイムスタンプ, 短文テキスト, 長文テキスト, 日付 ]
このタイムスタンプと日付はDateオブジェクトです。
で、この配列を渡すための下準備を行いました。これはGAS側のスクリプトです。ここではわかりやすくするために配列を返す関数名をtestにしています。これと同じことをすればおそらく現象を再現できます。
function doGet(){
return HtmlService.createHtmlOutputFromFile('index');
}
function test(){
return [new Date(2020,11,12), "件名", "本文", new Date(2020,11,02)];
}
ここまでは普通です。
そしてJS側はこんな処理を組みました。
function doSuccess(data){
document.write(data);
}
google.script.run.withSuccessHandler(doSuccess).test();
これで万事OKだわ…と思っていた私が甘かったです。
なんて出力されたと思います?これ。
nullですって。
配列ですらなくて笑っちゃうところなんですが、この作業は結構終盤にやっており、他の部分に原因があるものだとてっきり思い込んでしまったのが運の尽きでした。
結論を言います。どうやらこの書き方だと、GASからJSにDateオブジェクトを渡すことはできず、配列の一部分にでもDateオブジェクトを含めると強制的にデータがすべてnullに書き換わるみたいです。
マジふざけんなって感じですが、原因がわかってしまえば年月日を一度二次元配列に直して、それを後から日付に変換してしまえば問題ないということになります。
つまりこういうことです。
test(){
return [[2020,11,12], "件名", "本文", [2020,11,02]];
}
二度手間ですね!
もしこんなことしなくてもできるよ!というやり方を知っている方がいましたらぜひ教えて下さい()
ではまたネタが上がった頃に。