9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【DX推進】GASを使って学習で取り組む問題をスラック通知することで朝の学習を強制的にルーティング化する方法

Posted at

どうもエンジニア2年目を迎える元教員です。

10月に実施される「情報処理技術者検定」を受検する予定なのですが、

学習時間がちゃんと確保できてへん!!

基本は夜寝る前に勉強をしていました。
しかし最近はタスク優先になってしまったり寝てしまったり・・・

そこで

  • 強制的に朝やろう
  • 皆にやっているアピールをしよう(人の目がないとサボる)

結果、
指定した「応用技術者試験ドットコム」の問題URLをGASで取得し、Slackへ通知するbotを作成する
にしました。

非エンジニア、初学者にも優しい内容となっております。
ぜひお試しあれ。。。

完成形はこちら

image.png

毎朝5時に問題のURLが通知されます。

スプレッドシートの記入

slackへ通知する日付をA列に、載せたいURLをB列に書きます。
こちらのURLについては自動でスクレイピングする方法があります。
しかし現時点では手入力をしています。

image.png

SlackのIncoming WebHooksの登録

まずは通知をするslackチャンネルでIncoing WebHooksの設定をする必要があります。

  1. まずはインテグレーションからAppを追加します。
    image.png

  2. 通知するチャンネルを選択し、インテグレーションを追加します
    image.png

  3. Webhook URLが表示されるので、それを下記のpostUrlへ記入します。

var postUrl = 'https://hooks.slack.com/services/**********';
var username = 'morningStudybot';  // 通知時に表示されるユーザー名
var icon = ':hatching_chick:';  // 通知時に表示されるアイコン

ここまでが基本設定となります。

slackに投函するまで

スプレッドシートから情報取得

Function myFunction() {

  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート 
  const sheet = spreadsheet.getActiveSheet();                // シート  
  const activeCell = sheet.getActiveCell();                  // セル 

  var date = new Date();
  let now = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd');
  let URL = '';
  for(var i=3; i<10000000; i++){
    let Notificationdate = Utilities.formatDate(sheet.getRange(i,1).getValue(), 'Asia/Tokyo', 'yyyy/MM/dd');
    if(datee == now){
      URL = sheet.getRange(i,2).getValue(); 
      break;
    }
  }
  // 投稿内容  
  var message = "\本日の朝活問題だよ〜\n"  
                +  "問題URL:"     + URL     + "\n" 
                +  "1日最低5問よ〜" + "\n" 
"---------------------------------------------------------------------------------------------------------------------------------\n";

処理内容は簡単です。
やっていることとしては

1.今日の日付を取得
2.A列が今日の日付ならB列からURLを取得
3.URL取得後、messageに表示内容を格納

JSONに変換後Slackで投稿

var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

JSON形式に変換し、UrlFetchApp.fetch()メソッドを使って、Slackに投稿します。

指定時間でSlackに投稿するには

GASのトリガー設定では「時間主導型」という設定ができます。しかしこちらは1時間単位でしかできません。
具体的にいうと「午前5時〜午前6時」に設定してしまうと5時何分に実行されるかわからないという問題点が生じます。
今回はピッタリ5時に設定できる方法を紹介します。

やることは以下の2ステップです。

  1. 5:00に実行するトリガー登録をするスクリプトを毎日午前4~5時に実行
  2. 5:00になったら処理したいスクリプトが実行

それでは以下の方法で実装していきましょう。

myFunctionメソッドを5時に実行するトリガー

5時に実行するトリガーを以下のように実装しました。

function setTrigger(){
  //Dateオブジェクトで実行した時間を取得
  let time = new Date();
  //setHours,setMinutesでトリガー登録したい時間を設定
  time.setHours(05);
  time.setMinutes(00);
  //newTriggerメソッドで特定日時でトリガー登録
  ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
}

これで5時にmyFunctionメソッドが実行されます。

「時間主導型」で以下のようにトリガーを設定

image.png

これで今回設定したsetTriggerメソッドが4時〜5時の間に実行されます。

GASは初学者にも優しくDX化の入り口

今回はSlack通知にしましたが、LINEなどのSNSに同様の方法で通知することも可能です。英検など他のテスト対策や情報を通知できます。
また教員時代に連絡ツールとしてClassroomを使っていました。こちらにも類似の方法で通知が可能となります。

特定の時間に通知したいものがあっても

「あ、忘れてた!!」

ってことありませんか?
そういったことの予防策にもなるため、一度自動化に取り組んでみたらいかがでしょうか??

お読みいただき、感謝!!!

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?