特定ドメインの知識をつける際には資料を読んだり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を試してみましょう。