NotionのFAQをTipsとしてランダムでSlackに通知させるGAS作成をChatGPTに任せてみた

ChatGPTを利用して、Notionに蓄積したTipから1つランダムで定期的にSlackへ投稿するGASコードを生成してみました。要修正点や、ChatGPTが出すNotionAPIを利用したコードについての注意点についても触れています。
2023.10.06

特定ドメインの知識をつける際には資料を読んだりFAQを読み解くことが重要になってきますが、普段ふとしたタイミングで見かけた特定キーワードに関するTipsが元になり、そのTipsを元に資料やFAQ絞り込みに繋がることもあります。

FAQのある場所を認知してもらうための試みとして、FAQの項目をTipsとしてポストしつつ、そのURLを併記してみることにしました。

今回の要件

凝った作りにしないために、とにかくシンプルです。

  • 毎週月曜に動作
  • FAQデータベースからランダムで一つピックアップ
  • Slackにポスト

前回分のポストについては考慮しません。重複した内容とはいえ、その内容を直近で見たことが解決に繋がる可能性もあります。

実装コード

大体はまとまった要件ですが、言葉として整理できているのかを確認する意味も含めて、ChatGPTに投げてみました。

注意点として、ChatGPT内の集積データは2021年9月時点までとなっており、最新のNotionAPIには追従していません。以下はChatGPTが生成したコードです。

function pickRandomNotionRecordAndPostToSlack() {
  // Notionデータベースの情報
  var apiKey = 'YOUR_NOTION_API_KEY';
  var databaseId = 'YOUR_NOTION_DATABASE_ID';

  // SlackのWebhook URL
  var slackWebhookUrl = 'YOUR_SLACK_WEBHOOK_URL';

  // Notion APIのエンドポイント
  var notionEndpoint = 'https://api.notion.com/v1/databases/' + databaseId + '/query';

  // Notion APIのリクエストヘッダー
  var notionHeaders = {
    'Authorization': 'Bearer ' + apiKey,
    'Notion-Version': '2021-05-13'
  };

  // Notion APIのリクエストパラメータ
  var notionParams = {
    'method': 'GET',
    'headers': notionHeaders,
  };

  // Notionからデータを取得
  var notionResponse = UrlFetchApp.fetch(notionEndpoint, notionParams);
  var notionData = JSON.parse(notionResponse.getContentText());

  if (notionData.results.length > 0) {
    // ランダムにレコードを選択
    var randomIndex = Math.floor(Math.random() * notionData.results.length);
    var randomRecord = notionData.results[randomIndex];

    // Slackに投稿するメッセージを作成
    var slackMessage = {
      'text': 'ランダムに選択したNotionレコード:',
      'attachments': [
        {
          'text': JSON.stringify(randomRecord, null, 2)
        }
      ]
    };

    // Slackにメッセージを投稿
    var slackOptions = {
      'method': 'POST',
      'contentType': 'application/json',
      'payload': JSON.stringify(slackMessage)
    };

    UrlFetchApp.fetch(slackWebhookUrl, slackOptions);
  } else {
    Logger.log('データベースにレコードがありません。');
  }
}

このコードはそのままでは動作しません。明確な修正点は以下の通りです。

  • 今回のNotion APIのエンドポイントはPOSTリクエストが必要
  • 現在の最新Notion-Versionは2022-06-28

Notionに関しては、直近のアップデートも含んでいるため、差分が発生しても仕方ありませんが、それでもほぼ動作可能なコードとなっています。

なお、今回ChatGPTが提示したSlackへの投稿方法は、SlackBotを介して行うパラメータ構成であるようですが、実際にはWorkflow WebHookを選択しました。その理由は、実装コストを削減するためです。

また、毎週月曜日のタイマー起動については、ChatGPTには伝えていませんが、Google App Scriptのトリガーを利用するために省略しています。

他に必要なこと

このコードを少し書き換えただけでは動作しません。以下の操作が追加で必要になります。

  • Notionへインテグレーションを追加
  • 対象のデータベースへのコネクトにインテグレーションを追加
  • Slackでincoming用のWebHookを発行

あとがき

ChatGPTの蓄積範囲によりますが、パブリックなAPIではなくHeadless Chromeを使用したスクレイピングの処理も提案されることがあります。APIを明確に利用したい場合は生成されるまでRegenerateを試してみましょう。