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

前回はfunctionオブジェクトについてお話ししました。

今回からやっとブロックの中の関数についてです。

 

まずはスプレッドシートを呼び出す関数

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

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

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

 

前回、functionオブジェクトをふたつ使っているとお話ししましたが、今回からはfunctionオブジェクトのalertDateの中身(ブロック)を見ていきます。

 

SpreadsheetAppオブジェクト

 

alertDateのブロックでは、おおまかにいうと

  1. スプレッドシートの「備品管理」というシートを呼び出し
  2. A列、B列、C列のセルの中身をそれぞれ取得して
  3. 今日の日付も取得
  4. C列の返却予定日が今日の日付と一致していた場合、sendSlackの関数にA列、B列、C列のセルの中身を含むメッセージを送る

という命令を書いています。

 


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を送る
    }
  } 
}

 

今やりたいのは返却予定日になったらSlackにメッセージを投稿するということなので、使いたいのはC列の返却予定日のセルの値とかなんですが、まずスプレッドシートを呼び出さないとセルを取得できないので、スプレッドシートを呼び出しましょう

 

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("備品管理");

 

このふたつは

  1. スプレッドシートアクティブシート(現在のGASを開いたときに使用した元のスプレッドシート)を取得するコードと、
  2. シートを取得するコード

ですね。

 

最初なのでこのまま覚えてしまっていいんですが、もうちょっと詳しく説明します。

 

前回、functionではやりたい処理を全部ひとつのfunctionで書いても、区切って別のfunctionにしてもいいと説明しました。

 

とはいえ、functionの中の一つひとつの処理ではもちろん決まった関数、つまり処理のための決まった命令の書き方を使う必要があります。

 

今回のスプレッドシートを呼び出処理には、SpreadsheetAppという関数を使用します。

そしてさらにいうと、SpreadsheetAppでセルの値を呼び出すには決まった順に処理を行わないとセルの値を呼び出せません

というかどの関数でも上位と下位があるので下位の処理をさせたい場合は上位の処理も呼び出す必要があります…!

 

とりあえず、今はスプレッドシートで何か命令したい場合はSpreadsheetAppが必要なんだってことだけわかっておけば大丈夫です!

 

セルの値を取得するための上位オブジェクト

スプレッドシートの処理ではSpreadsheetAppが必要といいましたが、もちろんSpreadsheetAppだけを宣言しても何もできないので、もっと詳しくGASに命令していきましょう。

 

今やりたいのは、セルの値、例えばC1にある「2025/10/10」という日付を取得したいわけですよね。

 

管理番号、使用者、日付の入った管理表の画像

 

とはいえ、セルの値を取ってこいと命令してもGAS側ではどのセルのことなのか、さらにいえばどのスプレッドシートのどのシートのセルのことなのかわからないので、ちゃんとスプレッドシートやシート、セルを指定してあげる必要があります

 

先ほどお伝えした通り、決まった順に処理を行わないと呼び出せないというのはつまりこのことですね!

 

セルの値を呼び出したい→どのセルから値を呼び出したいのかわからないのでどのセルか範囲を指定したい→どのシートかわからないとセルの範囲が呼び出せないためシートを呼び出したい→どのスプレッドシートかわからないとシートを呼び出せないためスプレッドシートを呼び出したい→スプレッドシートの処理を行うためにはSpreadsheetAppを呼び出す必要がある

 

ということは、GASに命令する順番は

  1. SpreadsheetAppを呼び出す
  2. スプレッドシートを呼び出す
  3. シートを呼び出す
  4. セルの範囲を指定する
  5. セルの値を呼び出す

となるわけですね。

 

数学の証明のように、結論を導き出すために必要な条件をそろえていく感じが近いかなと思います。

目的のものを取得するためには必要な上位オブジェクトをそろえていかないといけないってイメージですね!

 

スプレッドシートの取得

というわけで、まずはgetActiveSpreadsheet()という命令文で、スプレッドシートを呼び出しましょう!

 

getActiveSpreadsheet()のアクティブスプレッドシートが何かというと、現在のGASと紐づいているスプレッドシート、つまりGASを開くために使ったスプレッドシートのことです。

ちょっと意味合いが違うようなのですが、一旦アクティブスプレッドシートはGASに紐づいてるスプレッドシートと覚えてもらえば大丈夫です!

 

このアクティブシートを呼び出したいので、SpreadsheetAppを使って

var ss = SpreadsheetApp.getActiveSpreadsheet();

と書くことで呼び出せます。

 

SpreadsheetAppを呼び出さずに、var ss = getActiveSpreadsheet();と書いてもエラーになるので注意してくださいね!

 

シートの取得

スプレッドシートが呼び出せたので、次は「備品管理」というシートを呼び出します

 

シートを呼び出すためには

getSheetByName("シート名")

の関数を利用します。

 

そのため、

var sheet = ss.getSheetByName("備品管理");

と書くとシートを呼び出すことができます。

ss?SpreadsheetAppじゃないの?という部分は次回説明します…!

 

とりあえず、これで「備品管理」のシートが使えますね!

 

最後の空の()は何?

ちなみに、getActiveSpreadsheet()の最後の()は必要なので書き忘れないよう注意してください

これがないと動きません…。

 

SpreadsheetAppにはないのに何でgetActiveSpreadsheetには空の()がいるの?って感じですよね。

シートの取得と違ってシート名を書いているわけでもないですし…。

 

これは何でgetActiveSpreadsheetでは()が必ずいるかといと、

値を取ってきても書き込む場所がないとその値を記憶することができないから

と理解して大丈夫だと思います。

 

記憶する場所として()を与えてあげている、ということですね。

 

getActiveSpreadsheetの場合、今使っているGASと紐づいてるのでスプレッドシートのURLを指定する必要はないんですが、実際に関数を実行にはURLが必要で、そのURL自体はアクティブスプレッドシートからGASが取ってきてくれるんですけど、URLを記録するところを用意してあげないと、一瞬だけURLを取ってきて終わりになってしまって、最後までURLを使うことができない、だから値をいれる場所である空の()が必要になるわけです。

 

この値を入れる空の()はスプレッドシートに限らず、何かを取ってくるよう命令のときは、毎回ちゃんと値を入れる空の()を用意してあげる必要がある、と覚えてもらえばいいと思います。

ちなみに何かを取ってくる、つまり取得するときはgetからはじまるメソッドを使います。

 

逆にSpreadsheetAppには何で()は必要ないの?って感じですが、SpreadsheetApp自体には値を取ってきたり、値を使ったりするわけではなく、スプレッドシートを動かすためにSpreadsheetAppというAppを呼び出していると考えるといいのかなーと思います。

 

アクティブではない別のスプレッドシートの呼び出し

蛇足ですが、別のスプレッドシートを呼び出したいときはopenByIdメソッドを使います。

openByIdメソッドはスプレッドシートのURLを指定してあげないとどのスプレッドシートを使えば良いのかGAS側が分からなくなるので

var ss = SpreadsheetApp.openById(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);

のように書きます。

※ xx~の部分はスプレッドシートのURLの【https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0】のxxxにしている部分をいれてください。

 

getActiveSpreadsheetと違い()が空じゃないですが、この場合は()の中にURLの値を指定しているのでこれを記憶として最後まで使えるわけですね。

ただopenByIdメソッドは今回は使わないので今すぐ覚えなくて大丈夫です!

 

 

次回はセルの値の取得の前に、よくわからないけど毎回つけているvar(変数)についてです。

 

前回