公開日:2022.05.23

googleスプレッドシートで指定した時間にスクリプトを実行する

テクログ

お久しぶりです。

JGです。

今回はgoogleスプレッドシートにある業務を行うか否かを、平日の決まった時間にチャットワーク通知させるものを紹介したいと思います。

準備するもの

下記画像のようなgoogleスプレッドシートを用意します。

仕様

今回作成したものは下記の仕様になります。

・平日の10時30分に通知

・A列の日付と本日の日付が一致した場合、C列の業務の有無とD列の備考を表示する

ソースコード

今回作成したソースコードです。

スプレッドシートを上から下に読み込み、A列の日付と 本日の日付が一致したら成功用のテキストを送信します。

一致しない場合は失敗用のテキストを送信します。

triggerに関する処理は後で説明します。

function myFunction() {
  //アクティブなシートを取得
  var sht = SpreadsheetApp.getActiveSheet();
  //アクティブなセルを取得
  var shtName = sht.getName();

  var toList = ["[To:222]ccc", "[To:333]ddd"]; //TODO
  var roomId = ''; //TODO

  if (shtName == '管理シート') {

    var date = new Date();

    var today = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd");
    var lastRow = sht.getLastRow();

    for (var i = 2; i <= lastRow; i++) {

      try {
        var tmpDate = sht.getRange(i, 1).getValue();
        var date = Utilities.formatDate(tmpDate, "Asia/Tokyo", "yyyy/MM/dd");
        if (today == date) {
          var chk = sht.getRange(i, 3).getValue();
          var memo = sht.getRange(i, 4).getValue();

          var body = createBodySucess(chk, memo, toList);
          sendChatwork(body, roomId);
          return;
        }
      } catch(error) {
        break;
      } 
      finally {

      }
    }

    var body = createBodyFail(toList);
    sendChatwork(body, roomId);
  }

  //チャットワークの成功の本文を作成
  function createBodySucess(chk, memo, toList) {
    var spsht = SpreadsheetApp.getActiveSpreadsheet();
    var spshtUrl = spsht.getUrl();
    var spshtId = spsht.getSheetId();
    var ret = "";

    for (i = 0; i <= toList.length - 1; i++) {
      ret += toList[i] + "さん\n";
    }

    ret += "[info][title]本日の業務状況[/title]\n";
    ret += "・業務有無\n";
    ret += chk + "\n";
    if (memo != '') {
      ret += "・備考\n";
      ret += memo + "\n";
    }
    ret +=  spshtUrl  +  "#gid=" + spshtId +"[/info]";
    return ret;
  }

  //チャットワークの失敗の本文を作成
  function createBodyFail(toList) {
    var spsht = SpreadsheetApp.getActiveSpreadsheet();
    var spshtUrl = spsht.getUrl();
    var spshtId = spsht.getSheetId();
    var ret = "";

    for (i = 0; i <= toList.length - 1; i++) {
      ret += toList[i] + "さん\n";
    }

    ret += "[info][title]本日の業務状況[/title]\n";
    ret += "今日のデータが未登録か予期せぬエラーのため、スプレッドシートを確認して下さい。\n";
    ret +=  spshtUrl  +  "#gid=" + spshtId +"[/info]";
    return ret;
  }

  //チャットワークに送る
  function sendChatwork(body, roomId) {
    var token = ""; //TODO
    //送信データ
    var params = {
      headers : {"X-ChatWorkToken" : token},
      method : "post",
      payload : {
        body : body
      }
    };
    var url = "https://api.chatwork.com/v2/rooms/" + roomId + "/messages";
    UrlFetchApp.fetch(url, params);
  }
}

function delete_trigger() {
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getHandlerFunction() == "myFunction") {
      ScriptApp.deleteTrigger(allTriggers[i]);
    }
  }
}

function add_trigger() {
  delete_trigger();

  //土日は通知しないため、トリガーを作成しない
  var date = new Date();
  var weekNum = date.getDay();
  if (weekNum == 0 || weekNum == 6) {
    return;
  }

  date.setHours(10);
  date.setMinutes(30);
  ScriptApp.newTrigger("myFunction").timeBased().at(date).create();
}

トリガーの設定

決まった日時に1回だけスクリプトを実行したい場合はスクリプトではなく、GUIから設定できますが、今回のような場合は下記画像のようにトリガーを設定し、かつスクリプトを書く必要があります。

add_triggerという関数を作成し、10時30分に実行させたいので、9時台にトリガーを設定します。

add_trigger関数では、トリガーを追加する前にdelete_triggerで過去のトリガーを削除します。

平日のみScriptApp.newTriggerでmyFunction関数のトリガーを10時30分に追加します。

こうすることで10時30分にmyFunction関数が実行され、チャットワーク通知がきます。

つまりトリガーが二つある状態で、 add_trigger関数でmyFunction関数のトリガーを10時30分に設定し、 myFunction関数で10時30分にチャットワーク通知を送信します。

最後に

多少内容は変えておりますが、実際にこのようなGASとチャットワーク通知の連携を業務で使っております。

今回のブログでGASについて少しでも興味を持っていただけると幸いです。

この記事を書いた人

JG

入社年2020年

出身地神奈川県

業務内容プログラム

特技または趣味サッカー観戦

JGの記事一覧へ

テクログに関する記事一覧