shiisuke’s blog

文系卒。社会人5年目くらい。ITやプログラミングの勉強で学んだことを書きます。

百人一首Botを作ってみた(GAS + SendGrid)

f:id:shiisuke1229:20190615182136p:plain

Ⅰ.きっかけ

GAS初心者向けのとある記事1に、「Botの作成は『コストパーヨロコビ』が大きいので初心者にとってもオススメ」と書いてあるのを見て、「これは楽しそうだからやるしかない!」と思ってトライしました。

Ⅱ.Google Apps Script(GAS)とは2

Ⅱ.方針

  • Botのテーマは個人的に好きな百人一首とする
  • 百人一首の歌を1分おきに1首ずつ、自動で送信する
  • 参考とした記事では通知先としてChatworkが使われていたが、今回はSendGridを利用してメール通知を行う

Ⅲ.使用したもの

Ⅳ.手順

1.百人一首のデータを準備する

(1)スプレッドシートを新規で開く

(2)百人一首の一覧を作成する3

f:id:shiisuke1229:20190615152102p:plain

2.スクリプトを作成・保存する

(1)SendGridのAPIキーを作成する4

(2)開いているシートのメニューから「ツール > スクリプトエディタ」を選択し、プロジェクトに名前を付ける(今回は「百人一首Bot」とした)

f:id:shiisuke1229:20190615153637p:plain

(3)以下のコードを記述する

function myFunction() {  
  /*アクティブな(スクリプトがバインドしている)スプレッドシートを
  Spreadsheetオブジェクトとして取得する(今回は「百人一首の一覧」のシート)*/
  var sheet = SpreadsheetApp.getActiveSheet();
  //最終行の行数を取得する(今回は「見出し行+歌100首」で101行)
  var lastRow = sheet.getLastRow();
  
  for(var i = 2; i <= lastRow; i++){
    //もしシート(i, 3)の値が空白ならば
    if(!sheet.getRange(i, 3).getValue()){
     //(i, 1)を起点として1行×2列分のデータを取得する
     var values = sheet.getRange(i, 1, 1, 2).getValues();
     //メールの本文を記述する
     var body = ""
     body += values[0][0] + '\n'; //歌
     body += values[0][1]; //作者
     
     //メールの宛先、件名、送信元、差出人、本文を指定する
     sendMail("宛先メールアドレス(To)を入力する", "百人一首Bot", "送信元メールアドレス(From)を入力する", "しいすけ", body);
     //送信を終えた歌の横に「送信済」と入力する
     sheet.getRange(i, 3).setValue("送信済");
     break;
    }    
  }
  
  //最終行まで行ったら、すべての行の「送信済」を削除する
  if(i >= lastRow){
    sheet.getRange(2, 3, lastRow -1).clearContent();
  }
}

//SendGridでメールを送信する
SEND_GRID_ENDPOINT = "https://api.sendgrid.com/v3/mail/send";
SEND_GRID_API_KEY = "作成したAPIキーを貼り付ける";

function sendMail(to, subject, from, from_name, body_text){
  var body = {
    "personalizations": [
      {
        "to": [
          {
            "email": to
          }
        ],
        "bcc":[
          {
            "email": from
          }
        ],
        "subject": subject
      }
    ],
    "from": {
      "email": from,
      "name": from_name
    },
    "content": [
      {
        "type": "text",
        "value": body_text
      }
    ]
  }
  var payload = JSON.stringify(body);
  UrlFetchApp.fetch(SEND_GRID_ENDPOINT, {
    method: "POST",
    headers: { "Content-Type": "application/json",
             "Authorization": "Bearer " + SEND_GRID_API_KEY},
    payload: payload
  });
}    

(4)メニューの「ファイル > 保存」または「Ctrl + S」(Macの場合は command + S)で保存する

3.メールの送信タイミングを設定する

(1)メニューの「編集 > 現在のプロジェクトのトリガー」を選択し、画面右下の「トリガーを追加」を選択する

(2)「イベントのソースを選択」で「時間主導型」を、「時間ベースのトリガーのタイプを選択」で「分ベースのタイマー」を、「時間の間隔を選択(分)」で「1分おき」をそれぞれ選択し、「保存」をクリックする

f:id:shiisuke1229:20190615173101p:plain:w400

4.スクリプトを実行する

(1)メニューの「実行 > 関数を実行」または「Ctrl + R」(Macの場合は command + R)を押す

(2)「承認が必要です」というダイアログが表示されるので、「承認を許可」→自分のアカウントを選択→「詳細 > 百人一首Bot(安全ではないページ)に移動」→「許可」という手順を踏む(初回の実行時のみ)5

(3)1分おきにメールが届き、スプレッドシートでは、送信後の歌の横に「送信済」と記載されていることを確認する

<届いたメール>

f:id:shiisuke1229:20190615173827p:plain:w400

<実行後のスプレッドシートf:id:shiisuke1229:20190615173950p:plain

Ⅴ.感想

今回の作業はとても手軽で、半日ほどで完成しました。そしてイメージ通りのものができた時は嬉しくて、一人で思わずガッツポーズしていました。「コストパーヨロコビが大きい」というのは本当でした(^^)

完成後に、「メール送信部分はGmailOutlookを使う方が簡単だったのではないか?」と気づいたので、次はそちらを試したいと思います。

Ⅵ.参考記事