🙄

スプシのデータをFirestoreに登録する方法

2024/04/18に公開

友人と趣味でアプリを作成している途中で、FirestoreのデータをGoogle スプレッドシートで閲覧したいという需要が発生しました。GASを使用して実装したのですが、今回はその手順についてまとめていきます。

Firestoreのライブラリを追加

まずは対象のスプレッドシートを開いてください。メニューバーから、「拡張機能 > AppScript」を開いてください。するとGASのエディタが開くと思います。まずはFirestoreのライブラリを追加しましょう。ライブラリのプラスボタンをクリックします。スクリプトIDの部分に「1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw」を入力します。そのまま追加をクリックします。

Firestoreへの認証情報を入力

続いて、GASがFirestoreにアクセスする際に必要な認証の情報を定義します。認証の際には、「email、key、projectId」の3つが必要になります。これらの情報は、以下の手順で入手します。

  1. Firestoreのコンソール画面左側からプロジェクトの設定をクリック。
  2. サービスアカウントのタブへ移動。
  3. Admin SDK構成スニペットでNode.jsを選択したまま、「新しい秘密鍵を生成」をクリック。
  4. ダウンロードされた秘密鍵のデータを以下のように対応させる。
    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)
  }
}

現状のコードでは、不足データがあった場合のエラー処理や、データ数に応じて範囲を指定する機能などがないため、改善の余地があると思います。より良いコードで書けたらぜひ教えていただきたいです。

参考記事

https://qiita.com/masa-321/items/86e356b02dcf5b840595
https://hashiori.blog/firebase/314/

Discussion