GASで期限をスプレッドシートからSlackに通知する【その5】

前回はライブラリの設定を行いました。

この記事はどんな人向け?

GAS初心者がスプレッドシートをもとにbotで期限をSlack通知した際、ここが困ったなーという部分が結構あったので、そのあたりを軸にまとめてみました。

そのため、同じく初心者で困っている人向けの記事です。

 

今回はfunctionオブジェクトについてです。

関数とは

コードでよくみるfunction(関数)、でも関数ってなんなのかよくわからないですよね…。

関数について辞書をみてみるとこうあります。

 

与えられた文字や数値に対し、定められた処理を行って結果を返す機能のこと。表計算ソフトやデータベースソフト、プログラミング言語などで利用される。関数ごとにさまざまな処理が割り当てられており、たとえば、表計算ソフトのExcelで「SUM」という関数を用いると、指定した範囲の合計が求められる。

関数 - 意味・説明・解説 : ASCII.jpデジタル用語辞典

 

わかるようなわからないような感じですが、ExcelスプレッドシートSUM関数のように「合計しろ」という命令に、「合計」で返ってくる一連の処理 のことのようです。

 

しかも、Excelなどでもそうですが、COUNTIF関数とSUM関数を組み合わせて命令できるように、 GASでも複数の命令を組み合わせてしてもいいし、さらにいうと複数の命令をどこで区切るかも自由に決めていい わけです。

 

じゃあその区切り方をどうするかというと、functionオブジェクト、つまり

function 関数名(){ // 処理 }

の処理の部分に何の処理をいれるか自分で決めてコードを書くということです。

 

初心者がわかりやすい感覚として書いていることなので、ちゃんとした説明はほかの方のものを見てほしいですが…!

 

functionオブジェクトの書き方

前回載せたコードでは、functionオブジェクトをfunction sendSlackfunction alertDateのふたつを使用しています。

(オブジェクトというまたわからない用語が出てきてますが、とりあえずfunction { からはじめって } で終わるひとかたまりと思ってください)

 

function sendSlack(text) {

    var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); //  トークンを取得
    var channel_id = PropertiesService.getScriptProperties().getProperty('channel_id'); //  チャンネルIDを取得
    var url = "https://slack.com/api/chat.postMessage"; // slackに投稿するメソッドの呼び出し

   // 投稿内容
   var payload = {
    "token" : token,
    "channel" : channel_id,
    "text" : text
   };
  
   var params = {
    "method" : "post",
    "payload" : payload
   };

  // Slackに投稿する
  UrlFetchApp.fetch(url, params);
}

function alertDate() {

  var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブシート取得 
  var sheet = ss.getSheetByName("備品管理"); // シートを指定

  
  // ループ数定義 
  var firstRow = 2; // スプレッドシートの2行目から
  var lastRow = sheet.getLastRow(); // 最終行を習得

  // アラート対象日フォーマット
  var date = new Date(); // 日付を習得
  var remindDate = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); // 今日の日付を文字列に

  for(var i = firstRow; i <= lastRow; i++) {
    // 各項目取得
    var number = sheet.getRange('A' + i).getValue();
    var person = sheet.getRange('B' + i).getValue();
    var closingDay = sheet.getRange('C' + i).getValue();

    var formatClosingDay = Utilities.formatDate(closingDay, 'JST', 'yyyy/MM/dd'); // C列の返却予定日を文字列に

     // アラート内容
    if (formatClosingDay === remindDate){ // remindDateとformatClosingDayが一致するなら

    var text = "今日が返却予定です\n>>>管理番号:" + number + "\n使用者:" + person + "\n返却予定日:" + formatClosingDay; // 通知内容

    sendSlack(text); // sendSlack関数にtextを送る
    }
  } 
}

 

これは私がふたつにわけたいと思ってわけているだけで、ひとつにすることもできます。

 


function alertDate() {

  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); //  トークンを取得
  var channel_id = PropertiesService.getScriptProperties().getProperty('channel_id'); //  チャンネルIDを取得

  var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブシート取得 
  var sheet = ss.getSheetByName("備品管理"); // シートを指定

  // ループ数定義 
  var firstRow = 2; // スプレッドシートの2行目から
  var lastRow = sheet.getLastRow(); // 最終行を習得

  // アラート対象日フォーマット
  var date = new Date(); // 日付を習得
  var remindDate = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); // 今日の日付を文字列に

  for(var i = firstRow; i <= lastRow; i++) {
    // 各項目取得
    var number = sheet.getRange('A' + i).getValue();
    var person = sheet.getRange('B' + i).getValue();
    var closingDay = sheet.getRange('C' + i).getValue();

    var formatClosingDay = Utilities.formatDate(closingDay, 'JST', 'yyyy/MM/dd'); // C列の返却予定日を文字列に

     // アラート内容
    if (formatClosingDay === remindDate){ // remindDateとformatClosingDayが一致するなら

    var url = "https://slack.com/api/chat.postMessage"; // slackに投稿するメソッドの呼び出し

   // 投稿内容
   var payload = {
    "token" : token,
    "channel" : channel_id,
    "text" : "今日が返却予定です\n>>>管理番号:" + number + "\n使用者:" + person + "\n返却予定日:" + formatClosingDay; // 通知内容
    };
  
   var params = {
    "method" : "post",
    "payload" : payload
   };

  // Slackに投稿する
  UrlFetchApp.fetch(url, params);

} } }

 

つまりひとつのfunctionでどこまで処理を行わせるか自分で決めていいということですね!

ローカル変数やグローバル変数などの兼ね合いで区切り方の規則性はなくはないようですが…。

 

ではなぜfunctionオブジェクトをわけるかというと、 長いコードを書くときにわけた方が分かりやすく、また同じ処理をさせたいときに簡単にできるからなど、 いろいろ都合がいいからのようなんですが、初心者からするとfunctionオブジェクトがふたつあるときは じゃあどうやったらふたつ実行できるの?ってところがわかりにくい と思うので、とりあえず動かしたい!ってことであれば、最初のうちはもう無理やりでもひとつのfunctionオブジェクトに全部書いちゃってもいいかなーと思います。

 

最初のうちはそんなに長いコード書くこともないと思いますので…。

(ちなみにふたつの関数をどうやって実行するかはそのうち後述します!)

 

functionオブジェクトの名前のつけ方

functionオブジェクトは関数なので、関数名の規則に従って先頭小文字のキャメルケースで書くようです。

 

キャメルケースとは、プログラミングなどで英語の複合語やフレーズ(句)、文を一語に繋げて表記する際に、各構成語の先頭を大文字にする方式。語の途中に大文字が出現する様をラクダ(camel)のこぶに例えた表現で、 “JavaScript” や “PlayStation” などの表記がこれに当たる。

キャメルケースとは 【プログラミング】 - 意味をわかりやすく - IT用語辞典 e-Words

 

今回は日付をアラートしたいので"alert date"を使ってalertDateにしています。

 

とりあえず初めて書くときにわかりにくい部分を説明しましたが、なんとなくfunctionオブジェクトについてわかったでしょうか?

とにかくfunctionオブジェクトに処理したいことを書いていくって形がわかれば大丈夫だと思います!

 

次はfunctionオブジェクトの中に書いてある関数について説明します!