メインコンテンツへスキップ
見出し画像

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, ペーパーバックでも読めます!


    画像




     
     
    家庭にAIを導入したら、毎日が前に進み始めた! 著書『AI×家事』扶桑社 WOMAN AI AWARD 2026 受賞 miyazakimari.com NHK・日テレ・フジ・雑誌ESSE・LDK・クロワッサン掲載 講談社with classコラムニスト

    あなたへのおすすめ