Google Apps Script(GAS)で効率化・自動化 その3

IT

昨日に引き続き、Google Apps Scriptのお勉強です。

今日はスプレッドシートの内容をGoogleカレンダーに登録する方法です。

ボリュームは多くないのでサクッと覚えちゃいましょう。

私が受講したUdemyの講座

「Google Apps Scriptの仕事効率化・自動化をプログラミングで実現」という講座のセクション9:[自動化⑤]シートからカレンダーへ自動登録の内容です。

【業務自動化をゼロからマスター】Google Apps Script(GAS)の仕事効率化・自動化をプログラミングで実現
【登録者数6000人突破】Google Apps Script(GAS)をマスターして毎日の業務(Google Workspace,G Suite,gmail、google スプレッドシート,google form)を劇的に自動化させよう。

今回学んだ内容

ずばり、Googleカレンダーへのスケジュールの一括登録です。

カレンダーへの予定一括登録ができると何が嬉しいの?

カレンダーへの登録なんて自動化しなくても良いのでは? と思う方がいらっしゃると思います。
あえて言いましょう。複数のカレンダーを使い分けないといけないことって結構あるんですよ、それで同じ内容を何度も登録するのって効率化しないと時間の無駄ですよね。

私はGoogleカレンダーはプライベートでしか使っていませんが、会社では「Outlook予定表」と「ガルーン予定表」の両方へのスケジュール登録が指示されています。※以下記事参照

こういったことがあるため、カレンダーの一括登録の方法(手法)は覚えておいて損なしです。

スプレッドシートの内容をカレンダーに登録

やっていることはシンプルですが、SpreadsheetAppクラス、CalendarAppクラスの使い方といったお作法は覚えておく必要があります。

1.スプレッドシート作成

Googleカレンダーに登録するためのデータをスプレッドシートに登録しておきます。

2.Googleカレンダーに登録する処理をGASで実装

スプレッドシートに登録されている行数分、ループ処理でGoogleカレンダーに登録する処理です。実際に動かしたコードは以下の通りです。

function registCalendar(){
  //登録先のカレンダー
  var calendar = CalendarApp.getCalendarById("Googleカレンダーのアドレス@gmail.com");
  //登録する予定(スプレッドシートに登録しているやつ)
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var contents = sheet.getRange(`A2:E${lastRow}`).getValues();
  //スプレッドシートの1行づつカレンダーに登録
  for(var i = 0; i < contents.length; i++){
    var [status, day, title, startTime, endTime] = contents[i];
    //既に登録済の予定はスキップ(continue)
    var strStatus = status.toString().toUpperCase();
    if(strStatus == "TRUE"){
      continue;
    }
    //Googleカレンダーに登録
    if(startTime == "" || endTime == ""){
      var date = new Date(day);
      calendar.createAllDayEvent(title, date);
    }else{
      var startDateObj = new Date(day);
      startDateObj.setHours(startTime.getHours());
      startDateObj.setMinutes(startTime.getMinutes());
      var endDateObj = new Date(day);
      endDateObj.setHours(endTime.getHours());
      endDateObj.setMinutes(endTime.getMinutes());
      calendar.createEvent(title, startDateObj, endDateObj);
    }
    //スプレッドシート側に登録済フラグを付与
    sheet.getRange(`A${i + 2}`).setValue("TRUE");
  }
}

このコードを実行するとGoogleカレンダーに登録されます。

一度登録したカレンダーを重複登録しないように、スプレッドシートに登録済フラグを付ける処理も行っています。

実はあったハマりポイント

シンプルな処理のように見えてハマりポイントがありました。

今回 Udemyで紹介されていたプログラムコードでは、スプレッドシートの情報を登録したら、スプレッドシートに”TRUE”というフラグを付けることで、次回実行時には重複してGoogleカレンダーに登録されないような制御をしています。

重複登録をスキップする判定式はこんな感じ↓

//既に登録済の予定はスキップ(continue)

    if(status == "TRUE"){
      continue;
    }

スプレッドシートから取得した値が “TRUE” だった場合は処理をスキップするものです。

しかし、何度実行しても重複登録されてしまいます。このスキップ処理が上手く動きませんでした。

原因は分かりました。

GASの大きな前提として、「大文字と小文字は別と判定される」のです。

ログを追って調査したところ、スプレッドシートの見た目の値は “TRUE”なのに、GASでスプレッドシートから取得した文字は “true”でした。

つまり、”TRUE”という文字を元に行っている重複排除の判定処理は動いていません・・・。

こういう時は、型変換+大文字変換で対処ですね。判定処理を行う際には大文字・小文字をそろえることがプログラミングの基本です。以下コードに書き換えて上手く動くようになりました。

//既に登録済の予定はスキップ(continue)

    var strStatus = status.toString().toUpperCase();
    if(strStatus == "TRUE"){
      continue;
    }

GASのお作法を一つ学べたので良かったと思います。

まとめ

1.スプレッドシートからGoogleカレンダーにスケジュールを一括登録する方法を学べました。

2.GASは大文字・小文字を厳密に区別するので、判定式が上手く動かないというハマりを経験しましたが、最終的にうまくいったので良い経験になりました。

コメント

タイトルとURLをコピーしました