Googleフォームから得られた回答から名簿と必要なデータのみが記載された表を作りました。
これで現状必要なスクリプトは全部書き終わりました。
1.コード全体
2.説明
2-1. レファレンス
Google Apps Script – Reference
2-2. スクリプトが終了しても値を保持しておきたい
今回はProperties Serviceを用いて保持しています。keyと対応するvalueを保存します。旧エディタでは簡単に値を見れたらしいですが、新エディタでは簡単に見れなくなったらしいです。
2-3. 日付からUNIX時間に変換する
更新するデータ化の判別をタイムスタンプを用いて行っています。最終更新日時と比較するために、どちらもUNIX時間に変換して比較しています。
日付からUNIX時間に変換するとき、Date.parse()を用います。
const date = "01 Jan 1970 00:00:00 GMT";
const unixTime = Date.parse(date);
console.log(unixtime); //0
引数となる日付の形式が実装によって異なるため、NaNになることがあるので注意です。
2-4. 二次元配列を一次元配列に変換する
いろいろな方法がありますが、Array.prototype.flat()を利用しました。
flat() メソッドは、すべてのサブ配列の要素を指定した深さで再帰的に結合した新しい配列を生成します。
引数を省略すると深さ1の配列になります。
2-5. null判定
typeof null // “object” (歴史的な理由で “null” ではありません)
typeof undefined // “undefined”
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true(nullより)
2-6. foreach
forEach()
メソッドは与えられた関数を、配列の各要素に対して一度ずつ実行します。arr.forEach(callback(currentValue[, index[, array]]) { // execute something }[, thisArg]);
C++の範囲forみたいなものかと思ってたら、もっと便利なメソッドでした。
構文から分かる通り、与えられた関数の引数に各要素の値だけでなくindexなども指定できます。
ただし、for文と違って途中でbreakすることはできません。
この記事を書いているときに調べたら、別のメソッドを利用することを検討したほうがリーダビリティが向上するってありました。
今回のケースだとfilter()メソッドで実装できたかな・・・。
2-7. アロー関数
C++メインなのでラムダ式や無名関数と言われたほうがピンときます。
今回はforEach()メソッドで与える関数として使いまくりました。
アロー関数式めっちゃ便利。
2-8. 自作関数から複数の配列を返したい
分割代入を用います。C++では構造化束縛と呼ばれます。
function fMain(){
let [arr1, arr2] = fSub();
console.log("arr1:%s, arr2:%s",arr1, arr2); //arr1:1,2,3, arr2:a,b,c
}
function fSub(){
const arr1 = [1, 2, 3];
const arr2 = ["a", "b", "c"];
return [arr1, arr2];
}
2-9. setValues()における引数によるエラー
The parameters (number[]) don’t match the method signature for SpreadsheetApp.Range.setValues.
setvalues()は引数に二次元配列のみです。そのため、一次元配列を渡すとこのようなエラーが出ます。
3. おわりに
Googleスプレッドシート上で必要なスクリプトは今の所必要なものは実装できました。
セキュリティの関係でローカルで行う作業が増えたので、またVBAを書くことになります。泣きそう。