ScrapboxのDiscord BOTをGASでつくる
やりたいこと
Scrapboxの更新通知の変更箇所を省略し、整えて投稿させる
DiscordはSlack WebHookと互換性がある
Discord から発行される WebHook URLの末尾に/slackを付けるだけで良い
しかし、そのままだと変更箇所が全て投稿されてしまい煩わしい。
GASで整形してDiscordにWebhookで投稿させる。
通知の受け取り方
code:js
const doPost = (e) =>{
const data = JSON.parse(e.postData.getDataAsString());
onReceive(data);
}
通知のデータ例
あくまでも例
code:json
{
"mrkdwn": true,
"username": "Scrapbox",
"attachments": [
{
"title": "Scrapboxの使い方",
"text": "Scrapboxの使い方\nScrapboxへようこそ。このページは自由に編集して活用できます。",
"rawText": "Scrapboxの使い方\nScrapboxへようこそ。このページは自由に編集して活用できます。",
"mrkdwn_in": [
"text"
],
"author_name": "けしごむ",
}
]
}
受け取ったデータを整形する
code:js
const onReceive = (data) =>{
const attachment = data.attachments0; post2Discord(attachment);
}
const post2Discord = (attachment) =>{
// <url|title> -> title(url) const reg = /<(?<url>^<>|*)\|(?<title>^<>|*)>/gm; const mdtext = attachment.text.replace(reg, "$<title>($<url>)"); // 行数を制限
const rowLimit = 5;
const textArray = mdtext.split(/\r\n|\n/);
let clipText="";
for (let i =0 ; i < Math.min(textArray.length,rowLimit);i++){
clipText =clipText + textArrayi + "\n"; }
// 行数超過時に誘導用のメッセージとリンクを追加
if(textArray.length > rowLimit){
clipText = clipText + [...(${(textArray.length-rowLimit)} 行の変更が省略されました)](${attachment.title_link});
}
const data = {
"content":"",
"embeds":[
{
"title":attachment.title,
"url":attachment.title_link,
"description":clipText,
"color":16776960,
"thumbnail":{
"url":attachment.image_url
}
}
]
}
const options = {
"method" : "POST",
'contentType': 'application/json',
'payload' : JSON.stringify(data)
};
UrlFetchApp.fetch(discordWebhook,options);
}
URLの置換
<url|title> という形で送られてくるので[title](url)へ置換する
正規表現
/<(?<url>[^<>|]*)\|(?<title>[^<>|]*)>/gm
実行例
https://gyazo.com/24a2db1b3ff0890b3f578b782d3f7f8c
いろいろカスタムすると楽しい
スプレッドシートをDB代わりに通知頻度を減らしたり
参考