marukot-chの日記

弱小SEの雑記です

お問い合わせが来たらDiscordで通知するようにした(GAS+Webhook)

3行で説明

  • Googleアドセンスやるには問い合わせorメールアドレスの公開が必要
  • お問い合わせきても分からない気がする
  • GAS(Google App Script)使って、DiscordへWebhook使ってメンション付きで通知されるようにしてみよっと

 

 

きっかけ

 Googleアドセンスって人生で関わったことがないけれど、ちょっとやってみたいなぁと思ってた。ちらっと調べてみると、はてなが公式で分かりやすそうな資料を公開してたので、挑戦してみようと考えた。資料をみるに連絡先が必要そうだが、メールアドレスは迷惑メールきそうで嫌。その場合、お問い合わせを作る必要がある。しかし、お問い合わせ来たのに気づかないのでは...。

blog.hatenablog.com

 

説明しないこと

 slackやDiscordのUserIDの取得方法は詳しく書かない。必要があれば下記を参照してほしい。
ユーザー-サーバー-メッセージIDはどこで見つけられる

SlackのIncoming Webhooksでメンションを飛ばす方法 - Qiita

 Webhookの取得方法も同様詳しく書かない。必要があれば下記を参照してほしい。

タイトル: Webhooksへの序章 - Discord
Slack での Incoming Webhook の利用 | Slack

 GAS作成時、承認が必要になるが、詳しく書かない。必要があれば下記を参照してほしい。

【初心者向けGAS】スクリプト実行時の「承認」でびっくりしないために

やったこと

(1)Google Formsでお問い合わせのフォームを作成

Google Forms
(2)お問い合わせのフォームにスクリプトを設定

 送信の右にあるメニュー的なやつで「スクリプトエディタ」を選択。

...>スクリプトエディタ

 コード.gsが作成されているので、その中身を以下に書き換え(WebhookのURL、メッセージは適宜変更)。

function onFormSubmit(e) {
  Logger.log('フォームが送信されたぞ');
  const webhookurl = 'https://discord.com/api/webhooks/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';// DiscordかSlackのWebhookをとってきてね!
  const user_name = 'お問い合わせフォーム';// 好きな名前に変更してね!
  const message_text = '<@!9999999999999> お問い合わせが来ました!';//好きなメッセージに変更してね! 数字の部分は自分のIDにしてね!
  postDiscord(webhookurl, user_name, message_text);
  // postSlack(webhookurl, user_name, message_text);// slackがいいならこっちを使う
}

 左の+ボタンから「スクリプト」を選択し、utilsと名前をつける(最初utils.gsってつけたら、utils.gs.gsが作成されて涙目になった...)。

スクリプトを追加

 以下のコードを貼り付け(Discordの画像URLは適宜変更のこと)。

function postSlack(webhookurl, user_name, message_text) {
  if (!webhookurl){
    return
  }
  if (!user_name){
    user_name = 'Bot'
  }
  if (!message_text){
    message_text = ''
  }

  // POSTの値
  var requestPayload = {
      'text': message_text,
      'username': user_name
  }
  // リクエストヘッダー
  var requestHeaders = {
      'Content-Type': 'application/json'
  }
  // リクエストオプション
  var requestOptions = {
      'method'  : 'post',
      'payload' : JSON.stringify(requestPayload),
      'headers' : requestHeaders
  }
  try {
    response = UrlFetchApp.fetch(webhookurl, requestOptions);
    Logger.log('postSlack-Finished!\n' + response);
  } catch(e) {
    Logger.log(e);
  }
}

function postDiscord(webhookurl, user_name, message_text) {
  if (!webhookurl){
    return
  }
  if (!user_name){
    user_name = 'Bot'
  }
  if (!message_text){
    message_text = ''
  }
  const parse = 'full';
  var requestPayload = {
    'content': message_text,
    'username'   : user_name,
    'avatar_url' : 'https://cdn.discordapp.com/attachments/792765244040675389/921661726863282176/pngegg.png',//好きな画像にしよう!
    'parse'      : parse
  };
  // リクエストヘッダー
  var requestHeaders = {
      'Content-Type': 'application/json'
  }
  const requestOptions = {
      'method' : 'post',
      'payload' : JSON.stringify(requestPayload),
      'muteHttpExceptions': false,
      'headers' : requestHeaders
  }
  try {
    response = UrlFetchApp.fetch(webhookurl, requestOptions);
    Logger.log('postDiscord-Finished!\n' + response);
  } catch(e) {
    Logger.log(e);
  }
}

 

 ここまで対応したら、一旦「onFormSubmit」メソッドを実行して、通知されるか確認する。

上の所から実行してみる

実行結果(とGASのログ)

 問題なさそうなら、「新しいデプロイ」からWebアプリとしてデプロイする。最初のやつだけ、本人確認やユーザー作成のスクリプトだけど大丈夫?みたいなものがくるのでOKしていく。

新しいデプロイ

デプロイ

 スクリプトのデプロイ(や承認)が完了したらこの手順は終了。

(3)フォームが送信されたらスクリプトが起動するようにトリガーを設定

 左にカーソルを移動し、時計みたいなマーク(トリガー)をクリック。

トリガーを選択

 実行する関数が「onFormSubmit」になっていることを確認し、イベントの種類を「フォーム送信時」に変更。保存する。

トリガーの保存

(4)フォームを送信してみて、想定通り動くことを確認

 Google Formsに戻り、右上の目玉みたいなマーク(プレビュー)からフォームを開き、実際に送信してみる。ちゃんとDiscordにメッセージが来ていればOK。

 

終わりに

 改めてGASって便利だなぁと思った。こんな記事書くのに1時間くらいかかってしまって悲しい。この記事が誰かの参考になれば嬉しい。