🙉

Notion API × GASでNotionのデータをスプレッドシートに移す②

2021/12/22に公開

https://zenn.dev/gasu/articles/0a9f69f00b1bdf
第一弾の記事については上記のURLから飛びます!
是非こちらを読んでから第2弾を読んでいただければと思います。

第一弾では
Notion側でapiを使用するために必要な設定、GASでapiを実行してスプレッドシートに書き込むためのデータを取得するところまでを記載しました。
あとは必要なプロパティにアクセスしてスプレッドシートに書き込んでいきます。

⑨スプレッドシートに書き込む用のメソッドの作成

取得したデータをスプレッドシートに書き込むコードは基本的に同じになるので
使いまわせるように、メソッドにしていきたいと思います。

//スプレッドシートに書き込むようのメソッド
function writeSpreadSheet(target_array, colmn){
  //スプレッドシートのシートのクラスを取得
  const game_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ゲームDB');
  let row = 2;
  //取得した配列をもとにスプレッドシートに記述する
    target_array.forEach((value) => {
      game_sheet.getRange(row, colmn).setValue(value);
      //次の行を作成するために1行追加
      row = row + 1;
  });
}

引数に
①値を取り出したい配列
②スプレッドシートに書き込みを行いたい列番号
を入れています。
ざっくりどんなことをしているかというと
ゲームDBのシートのスプレッドシートにアクセスして(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ゲームDB');)
配列が渡ってくるのでforEachで1つずつgame_sheet.getRange(row, colmn)で書き込む場所を指定して、setValue(value)で値を書き込んでいます。
この関数を使用して、apiで取得したデータをスプレッドシートに書き込んでいきます!

⑩notionDataToSpreadSheetを編集する

前回はページに紐づいているデータを取得しているだけで終了しているので、
他のステータスも含めスプレッドシートに書き込んでいきましょう!

  let db_data = getNotionDbData();
  let game_datas = db_data.results;

  //スプレッドシートに格納する値を抽出して配列に格納する
  let game_titles = [];
  let game_machines = [];
  let game_stars = [];
  let game_statuses = [];
  let game_categorys = [];
  let game_sites = [];
  let game_ids = [];


  game_datas.forEach((game)=>{
    let game_id = game.id;
    game_ids.push(game_id);
    //ゲームタイトルだけを取得して配列に格納する
    let game_title = game.properties.名前.title[0].text.content;
    game_titles.push(game_title);

    //ゲームの機器を取得して配列に格納する
    let game_machine = game.properties.機器.select.name;
    game_machines.push(game_machine);

    //ゲームの評価を取得して配列に格納する
    let game_star = game.properties.star.select.name;
    game_stars.push(game_star);

    //ゲームのステータスを取得して配列に格納する
    let game_status = game.properties.ステータス.select.name;
    game_statuses.push(game_status);

    //ゲームのカテゴリーを取得して配列に格納する
    let game_category = game.properties.Category.multi_select[0].name;
    game_categorys.push(game_category);

    //ゲームのサイトを取得して配列に格納する
    let game_site = game.properties.公式サイト.url;
    game_sites.push(game_site);
  })

  getNotionPageData(game_ids);
  //スプレッドシートに書き込むメソッドを使用して配列の値を入力していく
  writeSpreadSheet(game_titles, 1);
  writeSpreadSheet(game_categorys, 2);
  writeSpreadSheet(game_stars, 3);
  writeSpreadSheet(game_statuses, 4);
  writeSpreadSheet(game_machines, 5);
  writeSpreadSheet(game_sites, 6);

冗長なコードになってしまいましたが、、、
やっていることとしては
①各項目について記載されているプロパティにアクセスする
(例)let game_machine = game.properties.機器.select.name;
ここで気になったのは日本語のカラムにしているとプロパティにアクセスするときも日本語が登場するので気になる方は英語でカラムを記載したほうがいいかもしれません💦
あとこのプロパティにアクセスする作業が個人的に大変でした、、、(階層が深い)
②対象の項目専用の配列に格納する
game_machines.push(game_machine);
③データの配列を先ほど作成したメソッドを使用してスプレッドシートに書き込む
writeSpreadSheet(game_machines, 5);
game_machinesに格納されている値を5列目の2行目から順番に書き込んでいく処理を行なっています。

コードの記述はここまでになりますので、実際にnotionDataToSpreadSheet関数の実行を行ってみた結果をお見せします!

このように実際にスプレッドシートにnotionのデータベースの値を入れることができました!

まとめ

notionからapiを使用して実際にnotionのデータベースからデータを取得してスプレッドシートに格納することをやってみました!notionの設定の仕方やapi実行に必要なステータス、プロパティへのアクセス等何かしらの役に立てれば幸いです!!
(もしよかったら今回データで取得したゲームの感想の項目みてみてね)

Discussion