見出し画像

【GAS活用術①-3】LINEグループへリマインド通知を自動送信・その3

Google Apps Script (GAS)を、もっと身近に、日々の暮らしに。

前回、手順2までご紹介した、「当番や練習日の前日にリマインド通知をLINEグループへ自動で送る方法」の続きです。

前回は手順2としてLINE Notifyで2つのトークン(対象LINEグループのトークンと自分だけに通知するためのトークン)を取得しました。

今回は手順3としてついにGoogle Apps Script (GAS)の話です。


手順3:Google Apps Script(GAS)でfunction(関数)を作成する

まずはじめにGASでどんな関数を作るのか、概要をみていきましょう。

2023/12/29追記:作成する関数を当初4つにしていましたが、3つに減らしました(sendToGroup関数とsendToMe関数を、notifyPlan関数として集約しました)

今回は、3つの関数を作成します。作成した関数に対し、毎日定時に自動実行するトリガーを設定するのは、また後ほど、手順5で行います。

ではでは、実際のGASのコードを見ていきましょう。

function createMsg() {
  // 指定のシート上のデータがある範囲の表示値を表形式(正しくは二次元配列)ですべて取得
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("★シート名★");
  let table = sheet.getDataRange().getDisplayValues();

  //対象の日付(デフォルトでは明日の日付)を取得 
  let date = new Date();            //現在時刻を取得
  date.setDate(date.getDate() +1);  //日付を変更(明日なら+1, 明後日なら+2, 昨日なら-1)
  let targetDate = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');  //日付書式を設定

  //二次元配列の中で、0番目の列の値の0文字目から10文字分(yyyy/MM/dd)がtargetDateと同じ行を探す
  const index = table.findIndex(row => (row[0].slice(0,10) == targetDate)); 

  if (index != -1){                  //条件に一致した行があった(indexが-1でない)場合のみ
    let target = {                     //対象の行を連想配列として定義
      date: table[index][0],             //キー:dateに対象行の0番目の列の値をセット
      category: table[index][1],         //キー:categoryに対象行の1番目の列の値をセット
      plan: table[index][2]              //キー:planに対象行の2番目の列の値をセット
    };

    //LINEに送るメッセージを生成。文字と変数は+で連結。連想配列はtarget.キーで値を返す。
    //文字は""で囲む。改行は\n(\(バックスラッシュ)は日本語キーボードでは¥)
    const message = "\n明日、" + target.date + "の" 
                  + target.category + "の予定をお知らせします。\n"
                  + target.plan
                  + "\nよろしくお願いします!";

    //messageをログに出力
    console.log(message);

    //messageを戻す
    return message;
   } 
}

function notifyPlan(){
  //トークンを設定(自分自身の、またはグループのトークンのどちらかをコメントアウト)
  const token = "★自分自身のトークンをここに設定★"; //自分自身のトークン
  //const token = "★LINEグループのトークンをここに設定★"; //グループあてのトークン
  let msg =createMsg();    //createMSG関数の戻り値をmsgに
  if (msg != null) {       //createMSG関数が値を戻す(送付対象の予定がある)時だけ
    sendLine(msg, token);   //msgをtoken宛にsendLine関数で送信
  }
}

function sendLine(message,token){    
  //LINEに通知を送る関数sendLine。1つ目の引数(message)が送る内容、2つ目(token)が送り先
  
  let options = {
    "method": "post",
    "Content-Type" : "application/x-www-form-urlencoded",
    "payload": "message=" + message,
    "headers":{"Authorization" : "Bearer " + token}
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

初めて見た人にとっては「なんじゃこりゃ」、Excelのマクロの経験がある人は「マクロみたいなもの?」、スペシャリストからみたら「ここのコードがイマイチ」、、等々、いろいろご意見・ご感想はあるかと思いますが、今回は技術的な説明は一旦省いて、先に進みましょう!

では、上記のスクリプトをコピペする気持ちの準備ができたら、その手順に入っていきます。

スプレッドシートからApps Scriptを起動

Googleドライブから手順1で作成した、スプレッドシートを開きます。
メニューバーから、拡張機能 > Apps Script を選択します。

Apps Scriptのスクリプトエディタが表示されました。ファイル:コード.gsに、「function myFunction」が表示されています。

スクリプトをコピぺして一部修正する

「function myFunction ( ) { }」のところに、上書きする形で上記(↑)のコードをコピぺします。コピーする時は、最後の } までしっかりと。

ちなみに、右上のアイコンをクリックするだけで全体をコピーできます。

スクリプトエディタで一旦、「function myFunction ( ) { }」を消してからペースト。

ペースト後、以下の3箇所(★~★までの間)を修正します。

  • 3行目のシートの名前:"★シート名★" の部分を自分のシート名へ変更。
    私は「読み聞かせ予定表」というシート名にしたので、
    getSheetByName("読み聞かせ予定表"); と変更します。

  • 38行目の自分自身のトークン:"★自分自身のトークンをここに設定★"のところに手順2で取得した自分自身のトークンをペースト

  • 39行目のグループあてのトークン:"★LINEグループのトークンをここに設定★"のところに手順2で取得したLINEグループのトークンをペースト

注:シート名やトークンは文字列になるので、両端を "(ダブルクォーテーション)で囲む必要があります。" "で囲まれた中(★~★までの間)を変更して、" "は消さないようにしてください。

上記の修正をしたら、「無題のプロジェクト」をクリックして、プロジェクト名を変更しておきます。

スクリプトは自動保存ではないので、明示的に保存する必要があります。ツールバーの保存ボタンでプロジェクトを保存します。

注:この保存の時点でエラーになったら、最後の } がないとか、3箇所の修正をする時に” ”を消してしまっているなどの理由が考えられます。

いざ、実行!・・・と、その前に実行権限の確認・承認

エラーなく、プロジェクトの保存ができたら、試しに関数を実行してみましょう。

ツールバーの「デバッグ」と「実行ログ」の間の"createMsg"と書かれた「実行する関数を選択」のプルダウンをクリックしてみると、3つの関数が表示されます。

今、実行したい関数はこの3つの中の、一番上の"createMsg"関数なので、"createMsg"のまま、実行ボタンをクリックします。
何が起きるかと思ったら、、、「承認が必要です」というダイアログが表示されると思います。

実は、初めてGASのスクリプトを実行する際は、スクリプト実行権限の確認・承認を行う必要があります。

初めてだと戸惑いますが、慣れてくると「またか」という感じで、新しいプロジェクトを初めて実行する時、一回だけなので、さくさくっと実行権限を承認しましょう。

  1. ダイアログ上で「権限を確認」をクリック。

  2. Googleにログイン画面で、自分のアカウントを選択。

  3. 次の画面で、「詳細」、「[プロジェクト名](安全ではないページ)に移動」を順番にクリックします。
    ※ここで「安全なページに戻る」と実行権限の承認はできません。

  4. 最後の画面で「許可」をクリックすることで、実行権限の承認完了です。

今度こそ実行

それでは、実行するのはcreateMsg関数であることを確認して、再度、実行ボタンをクリックしてみましょう!

スクリプトエディタの下に、「実行ログ」が表示され、"お知らせ 実行開始"と"お知らせ 実行完了"と出力されたら、無事、実行されています。

え?LINE、送られてこないけど??と思われた方、それであってます。createMsg関数には、LINEを送る処理は含まれていないので。

この時点では、まず実行時にエラーにならないことを確認してください。実行時のエラーの原因としては、3行目で違うシート名を指定してしまっている、などの理由が考えられます。

とりあえず無事に「実行完了」するのが確認できたら、今回はこの辺で。次回は手順4としてcreateMsg関数がきちんと動くか、動作確認・テストをします。ついにLINEの通知が自分あてに届くところも確認しますよ。

この記事が気に入ったらサポートをしてみませんか?