見出し画像

#134 Google スプレッドシートの内容を Notion に書き出す


はじめに

この note で ↓ のように分類している GAS のプログラムについては、

↓ のように Notion でも一覧にしています。

自分自身でもどんなプログラムを作ったのかを忘れてしまうので、一覧にしておこうと考えて Notion で一覧にしたものですが、認定トレーナーの実績報告の絡みもあって、元となるデータが Google スプレッドシートに入力してあって、その内容を転記することで登録しています。

というような Notion への登録をくり返してきたのですが、こんな作業が Notion API を利用すれば GAS から登録できると聞き、検索してみました。

参考にしたサイト

検索してみるといくつものサイトが見つかりましたが、note 系から ↓ のサイトを選択。

  1. 新規インテグレーション作成→トークン取得

  2. コネクトの追加&データベースID取得

  3. スクリプトプロパティにデータベースIDとトークンを格納

  4. GASのスクリプト

  5. GAS実行

という感じで、スクリーンショット付きで説明されていました。説明されている手順に沿って操作していけば、上記の手順はクリアできると思います。
上記の記事と同じ説明を焼き直してもしょうがないので、具体的な説明は省略して、以降では実際にわたしが作成したプログラムと、気付いた点について記録しておきます。

わたし自身は、上記 URL の記事の内容だけで、そこから更に他のページを参照することなく目的が達成できました。👍

作成したプログラム

問題になるのは、前述の 4. の部分だと思います。元となるスプレッドシートや、Notion のデータベースの内容によって、登録する内容が異なるので、この部分は自身の状況にあわせて変更しなければなりません。

わたしは、前述の記事のプログラムを参考にして、以下のようなプログラムを作成して、Google スプレッドシートのメニューから実行できるようにしました。 ※↓ は、実際に呼び出される関数の部分です。

/***
 * カーソルのある行の内容をもとにして、Notion にデータを追加する。
 */
function addNotion() {
  let sheet = SpreadsheetApp.getActiveSheet();      // 現在開いているスプレッドシート
  let row = sheet.getActiveRange().getRow();
  let column = sheet.getActiveRange().getColumn();
  console.log("Active : " + row + "," + column);

  if (row != 1) {                                   // 先頭行でなければ処理する
    const trainingName = sheet.getRange(row, 2).getValue();
    const trainingText = sheet.getRange(row, 8).getValue();
    const postURL = sheet.getRange(row, 7).getValue();

    //スクリプトプロパティに格納したデータベースID、トークンを取得
    const props = PropertiesService.getScriptProperties();
    const dbId = props.getProperty('NOTION_DB_ID');
    const token = props.getProperty('NOTION_TOKEN');
    const apiUrl = 'https://api.notion.com/v1/pages';

    //データベースIDを渡しオブジェクトを生成
    const pageObj = {
      parent: {
        database_id: dbId,
      },
      properties: {
        "名前": {
          "title": [{
            "text": {
              "content": trainingName
            }
          }]
        },
        "記事の概略": {
          "rich_text": [{
            "text": {
              "content": trainingText
            }
          }]
        },
        "URL": {
          "url": postURL
        },
      }
    }

    //NotionAPIにポストしデータを追加
    const options = {
      "method": "POST",
      "muteHttpExceptions": true,
      headers: {
        "Content-type": "application/json",
        "Authorization": "Bearer " + token,
        "Notion-Version": '2022-06-28',
      },
      payload: JSON.stringify(pageObj),
    };
    let res = UrlFetchApp.fetch(apiUrl, options);
    Logger.log(res);
  }
}

Google スプレッドシートで管理している「タイトル」「記事の概略」「URL」を読み込み、Notion のデータベースに書き出しています。

気付いたこと、補足

実際に、

  • UrlFetchApp.fetch の呼び出し時に、
    "muteHttpExceptions": true,
    を追加しておくことで、データベースに追加するデータの種別に誤りがあるときに、ログでその詳細がわかる。少なくとも、うまく動作するまでは付けておいた方がいいと思います。

という感じ。実際に以下のようにエラーがログに記録され、データ種別を変更しました。

{"object":"error","status":400,"code":"validation_error","message":"記事の概略 is expected to be rich_text.","request_id":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}

最後に

今回のプログラムは、わたし自身の環境での例なので、例示しているだけでそのまま使えるものではありません。また、元になった記事の内容を転記した説明を省略しているので、わたしのこの記事を見ただけでは理解できないと思います。
こうやって、先人の残してくれた記事によって、問題が解決できるのはいいことだなと思います…

今回のプログラムでは、Google スプレッドシート → Notion というプログラムでしたが、Google フォーム → Notion という流れも同じように実現できます!

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。

  • 実行に際して目的外の場所への書き出しや収集などは行っていません。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。
これらの記事への感謝の意は、記事に対する「スキ ♡」や、以下のような Amazon のアフィリエイトリンク経由での商品の購入、note の「サポート」機能を利用してもらえると、このようなプログラム作成の励みになります。😍

記事の下部にある note の「サポート」機能
  • Amazon のアフィリエイトリンクを開くと、それ以降 24時間以内に商品を購入した場合に、紹介者(この場合は、わたし)に紹介料が発生します。


いいなと思ったら応援しよう!