🙄
スプシのデータをFirestoreに登録する方法
友人と趣味でアプリを作成している途中で、FirestoreのデータをGoogle スプレッドシートで閲覧したいという需要が発生しました。GASを使用して実装したのですが、今回はその手順についてまとめていきます。
Firestoreのライブラリを追加
まずは対象のスプレッドシートを開いてください。メニューバーから、「拡張機能 > AppScript」を開いてください。するとGASのエディタが開くと思います。まずはFirestoreのライブラリを追加しましょう。ライブラリのプラスボタンをクリックします。スクリプトIDの部分に「1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw」を入力します。そのまま追加をクリックします。
Firestoreへの認証情報を入力
続いて、GASがFirestoreにアクセスする際に必要な認証の情報を定義します。認証の際には、「email、key、projectId」の3つが必要になります。これらの情報は、以下の手順で入手します。
- Firestoreのコンソール画面左側からプロジェクトの設定をクリック。
- サービスアカウントのタブへ移動。
- Admin SDK構成スニペットでNode.jsを選択したまま、「新しい秘密鍵を生成」をクリック。
- ダウンロードされた秘密鍵のデータを以下のように対応させる。
email→client_email
key→private_key
projectId→project_id
これら3つの要素をまとめて返す関数を以下のように作成しました。
function firestoreCertification() {
var certification = {
"email": "client_emailを入力",
"key": "private_keyを入力",
"projectId": "project_idを入力"
}
return certification;
}
Firestoreへの登録部分
今回は画像のようなデータをFirestoreに登録しようと思います。1行目が各要素がキーとなり、2行目以降がそれぞれ1レコードとなるようにします。
データを登録する部分のコードは以下の通りです。
function postData (){
// スプレッドシートを取得
//シートの名前を入力
var sheet = SpreadsheetApp.getActive().getSheetByName('works');
//Firestoreへの認証のための変数を用意
var certification = firestoreCertification();
var firestore = FirestoreApp.getFirestore(certification.email, certification.key, certification.projectId);
try {
//各列のデータをそれぞれ取得
var ids = sheet.getRange('A2:A100').getValues();
var dates = sheet.getRange('B2:B100').getValues();
var scheduledStartTimes = sheet.getRange('C2:C100').getValues();
var scheduledEndTimes = sheet.getRange('D2:D100').getValues();
var userIds = sheet.getRange('E2:E100').getValues();
var helperIds = sheet.getRange('F2:F100').getValues();
// 取得してきたデータ分だけforで回す
for (let i = 0; i < ids.length; i++) {
var id = ids[i][0];
var date = dates[i][0];
var scheduledStartTime = scheduledStartTimes[i][0];
var scheduledEndTime = scheduledEndTimes[i][0];
var userId = userIds[i][0];
var helperId = helperIds[i][0];
var postdata = {
date: date,
scheduledStartTime: new Date(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours() + scheduledStartTime / 100,
date.getMinutes() + scheduledStartTime % 100,
00
),
scheduledEndTime: new Date(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours() + scheduledEndTime / 100,
date.getMinutes() + scheduledEndTime % 100,
00
),
userId: userId,
helperId: helperId
}
// コレクションにdocumentを登録していく
firestore.createDocument(`work/`+ id, postdata);
}
} catch(e) {
Logger.log(e)
}
}
現状のコードでは、不足データがあった場合のエラー処理や、データ数に応じて範囲を指定する機能などがないため、改善の余地があると思います。より良いコードで書けたらぜひ教えていただきたいです。
参考記事
Discussion