MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Google Apps Script でスプレッドシートを Notion のテーブルにコピー

f:id:mofumofu_dance:20210514232715p:plain

5/13からパブリックベータが開始された Notion API と、最近勉強を始めたGASを組み合わせて、スプレッドシートの内容をNotionにコピーしてみました。

f:id:mofumofu_dance:20210514231034p:plain

なお、Notion API の使い方は前回の投稿で紹介しています。

mofumofupower.hatenablog.com

Notion の テーブル構成

非常にシンプルに、日付型の列を1つと、リッチテキスト型の列を1つテーブルに追加しました。

f:id:mofumofu_dance:20210514231328p:plain

この場合、アイテム作成APIを実行するときのBodyは

{
    "parent": {
        "database_id": "DATABASE_ID"
    },
    "properties": {
        "Name": {
            "title": [
                {
                    "text": {
                        "content": "Yurts in Big Sur, California"
                    }
                }
            ]
        },
        "Description": {
            "rich_text": [
                {
                    "text": {
                        "content": "A dark green leafy vegetable"
                    }
                }
            ]
        },
        "Date": {
            "type": "date",
            "date": {
                "start": "2021-01-01",
                "end": null
            }
        }
    }
}

となります。

GAS のスクリプト

GAS では 以下の処理を行っています。

  1. スプレッドシートの内容を取得
  2. JSON配列化
  3. Notionのアイテム作成APIのボディに合わせる
  4. API実行

この中で、3,4の処理は複数アイテムに対して行うのでループ処理しています。

また、Notion API のレートリミットが 3 request/sec ということで、Utilities.sleep()で遅延処理を入れています。

const NOTIONTOKEN = ここにNotionのシークレット;
const DATABASEID = ここにデータベースID;

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const js = convertJson(ss.getDataRange().getValues());

  js.forEach(function (elem, index) {
  //スプレッドシートの内容のJSON配列から、Notionのボディにマップ
    const obj = {
      "parent": {
        "database_id": DATABASEID
      },
      "properties": {
        "Name": {
          "title": [
            {
              "text": {
                "content": elem.Name
              }
            }
          ]
        },
        "Description": {
          "rich_text": [
            {
              "text": {
                "content": elem.Description
              }
            }
          ]
        },
        "Date": {
          "type": "date",
          "date": {
            "start": Utilities.formatDate(elem.Date, "JST", "yyyy-MM-dd"),
            "end": null
          }
        }
      }
    };
    postNotion(obj);
    Utilities.sleep(1000);
  });

}

//Notionに対してアイテムを登録
function postNotion(object){
  const options = {
  method: 'post',
  headers: {
    'Content-Type': 'application/json',
    'Notion-Version':'2021-05-13',
    'Authorization':"Bearer "+NOTIONTOKEN
  },
  payload: JSON.stringify(object)
};
console.log(options)
  var response = UrlFetchApp.fetch('https://api.notion.com/v1/pages', options);

}

//スプレッドシートの内容の配列からJSON配列に加工する
function convertJson(range) {
  const key = range[0];

  const js = range.slice(1).map(
    function (row) {
      const obj = {};
      row.map(function (item, index) {
        obj[String(key[index])] = item;
      }
      );
      return obj;
    });
  return js;
}

ということで大変シンプルな感じでできました。 (スクリプト部分は最適ではないと思いますが)

動作は以下からご確認いただけます。

おわり

新しく使えるようになったAPI と 勉強中の内容を組み合わせてみました。

Notion の APIが公開されたことで、Google系のサービスからもデータを引っ張ってきやすくなりますね。

GAS便利ですわ。