見出し画像

Notionでメールマガジンを管理する:スプレッドシートのデータをNotionへGoogle Apps Script(GAS)を使って転記する編




最新記事はこちら⬇️です。


はじめに

デジタル化が進み情報が氾濫する中、情報をうまく管理し整理することが大切な課題になっています。
特に、私にとって毎日届くメールマガジンは価値ある情報源ですが、管理に労力がかかります。Gmailのメールマガジンを読むのが大変で整理しづらいと感じていました。

Chrome拡張機能を使ってみる


そこで、メールマガジンをNotionに保存するChromeの拡張機能「Save to Notion」を使うようにしました。しかし「1クリック」とはいえ、手動で保存していたため、効率が悪いと感じていました。

自動化への第一歩:Gmail からスプレッドシート

そこでGoogle Apps Script(GAS)を学び、メールマガジン受信時にタイトルと本文をスプレッドシートに自動出力するシステムを作りました。これはメールマガジン管理の大きな進歩で、自動化への第一歩だと思います。



次のステップ:スプレッドシートからNotion


今日はこれの続きで、いよいよスプレッドシートのデータをNotionに転記するプロセスについて記録したいと思います。
タイトルと日付をNotionのプロパティへ、
本文を下の自由に書ける部分(ブロック)へ出力してみました。


必要なツール

  • Google Spreadsheet

  • Google Apps Script

  • NotionアカウントとAPIキー

ステップ1: Spreadsheetを準備しよう

まず、メールのデータが入ったGoogle Spreadsheetを用意します。タイトル、日付、本文が記載されていることを確認してくださいね。
私は、このような方法で、Gmailに届くメールマガジンをSpreadsheetへ自動的に保存しています。


ステップ2: Notionに接続しよう

次に、NotionのAPIキーを取得します。これはNotionの設定ページから簡単に取得できます。APIキーがあれば、Notionにデータを送れるようになります。
以下のページがとても参考になります。


ステップ3: スクリプトを書こう

Google Apps Scriptを使って、Spreadsheetのデータを読み込んでNotionに送るコードを書きます。 
下の方に書いているので興味があれば見てみてください!

ステップ4: タイトルと日付を送ろう

タイトルと日付は、Notionの「プロパティ」として送ります。これで、Notion上でキレイで見やすく便利に整理されます。

ステップ5: 本文をどうする?

本文は、Notionのページ内に「ブロック」として追加します。これで、長い文章も読みやすく表示されます。

ステップ6: 長い本文を分けよう

もし本文が2000文字を超えていたら、ちょっと工夫が必要です。2000文字ごとに分けて、複数のブロックにして送ります。

まとめ

これで、やっと、SpreadsheetのデータをNotionに自動的に移行することができるようになりました!!


スクリプトについて

function addDataToNotion() {
  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';

  const obj = generateNotionPageObject(dbId);
  postToNotion(apiUrl, token, obj);
}

function generateNotionPageObject(dbId) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');//「メール」というシートの
  const date = formatDate(sheet.getRange(2, 1).getValue());//(2,1)にある日付
  const mainTitle = sheet.getRange(2, 2).getValue();//(2,2)にあるタイトル
  const content = sheet.getRange(2, 3).getValue(); //(2,3)にある本文
  const contentBlocks = splitTextIntoBlocks(content, 2000); // 本文を2000文字ごとに分割

  return {
    parent: { database_id: dbId },
    properties: {
      "日付": { "date": { "start": date, "end": null }},
      "メインタイトル": { "title": [{ "text": { "content": mainTitle }}]},
    },
    children: contentBlocks.map(block => ({
      type: 'paragraph',
      paragraph: {
        rich_text: [{ type: 'text', text: { content: block } }]
      }
    }))
  };
  }


function postToNotion(apiUrl, token, pageObject) {
  const options = {
    method: "POST",
    headers: {
      "Content-type": "application/json",
      "Authorization": `Bearer ${token}`,
      "Notion-Version": '2022-06-28',
    },
    payload: JSON.stringify(pageObject),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(apiUrl, options);
  Logger.log(response.getContentText());
}

function formatDate(date) {
  return Utilities.formatDate(new Date(date), "Asia/Tokyo", "yyyy-MM-dd");
}

function splitTextIntoBlocks(text, maxLength) {
  var blocks = [];
  for (let i = 0; i < text.length; i += maxLength) {
    blocks.push(text.substring(i, Math.min(i + maxLength, text.length)));
  }
  return blocks;}

このスクリプトはGoogle Apps Scriptを使って、Google Spreadsheetに保存されているデータをNotionのデータベースに転送するためのものです。具体的には、

Spreadsheetの「メール」というシートから
特定の列のデータ(日付、メインタイトル、本文)を読み取り、
それらをNotionのページとして新たに作成します。

各関数の役割は以下の通りです。

◆addDataToNotion 関数

PropertiesService.getScriptProperties()を使用して、スクリプトのプロパティからNotionデータベースのIDとAPIトークンを取得します。
次に、generateNotionPageObject関数を呼び出して、Notion APIに送信するためのページオブジェクトを生成します。
最後に、postToNotion関数を呼び出して、このページオブジェクトをNotionに送信します。

◆generateNotionPageObject 関数

この関数はNotionページオブジェクトを生成します。
まず、Spreadsheetの「メール」シートから必要なデータを読み取り、
そのデータを用いてNotionのページオブジェクトを作成します。
このオブジェクトには、ページの「parent」(親データベースID)、プロパティ(日付、メインタイトル)と、本文が含まれます。
本文は2000文字ごとに分割され、複数のパラグラフブロックとしてページに追加されます。

◆postToNotion 関数

この関数は、指定されたNotion APIのURLにページオブジェクトをPOSTリクエストとして送信します。
リクエストのヘッダーには、コンテンツタイプ、認証トークン、Notion APIのバージョンが含まれます。リクエストの本文(payload)には、JSON形式でシリアライズされたページオブジェクトが含まれます。送信が完了すると、レスポンスがロガーに記録されます。

◆formatDate 関数

この関数は、日付を「Asia/Tokyo」タイムゾーンに基づいて「yyyy-MM-dd」形式にフォーマットします。これは、Spreadsheetから読み取った日付データをNotion APIに適した形式に変換するために使用されます。

◆splitTextIntoBlocks 関数

この関数は、与えられたテキストを指定された最大文字数(この場合は2000文字)ごとに分割します。これは、Notionのテキストブロックには2000文字の制限があるため、長いテキストを適切に分割するために必要です。


ーーーーーーーーーー
私の書いた本が出版されました!
\Twitterからうまれた/
ちょっと理系なおうち遊びの本

Amazon 売れ筋ランキング  
幼児教育 カテゴリー  有料Top100
ベストセラー1位✨ になりました!
ありがとうございます!


KindleUnlimited, ペーパーバックでも読めます!





この記事が気に入ったらサポートをしてみませんか?