1.目的と課題
- スケジュールの数や人数が多い組織で、
すべての予定をGoogleカレンダーから取得すると、
転記先のGoogleスプレッドシートの動作が重くなる
「営業メンバー全員の当日以後30日までの商談スケジュールを、
Googleスプレッドシート(以下スプシ)上で把握したい」
という要望があり、
GASを用いて、Googleカレンダーから
各メンバーのスケジュールを自動取得して、
スプシに転記するようなシステムを作ることになりました。
しかし、筆者の所属先は商談の回数が多く、
またMTGなど商談以外のスケジュールや、スケジュールの取得対象となる人数も多いため、
彼らのすべてのスケジュールを取得・転記した場合、
・GASの実行完了までに時間がかかる
・スプシの動作自体も重くなる
など、業務に支障が出ることが分かりました。
2.改善策
そこで、「スケジュール名が特定の条件を満たした場合のみ(商談のスケジュールのみ)、
自動取得してスプシに転記」というシステムに改良しました。
今回は、取得したスケジュールの先頭1文字が
「◎」の場合のみ取得、という形にしてみました。
(他のスケジュール名と被らなければ、「◎」に限らず任意の文字列で大丈夫です)
3.コード作成
function calendar() {
const sp = SpreadsheetApp.getActiveSpreadsheet();
const startTime = new Date(); //引数省略により現在日付時刻を取得
const endTime = new Date(Date.parse(startTime) + (30 * 60 * 60 * 24 * 1000));
// parseで日付を文字列に変換
const ash = sp.getSheetByName('スケジュール転記先のシート名');
const lastRow = ash.getLastRow (); //シートの最終行取得
ash.getRange(2,1,lastRow,4).clearContent();
//実行前に、A~D列の2行目以降(前回の内容)をクリアして初期化
//(1行目は項目名、2行目以降にデータが入っているものと仮定)
const cal = CalendarApp.getCalendarById('【メールアドレス】');
const event = cal.getEvents(startTime,endTime);
let i = 2 //予定転記先シートの行数カウント用の変数
let j = 0 //カレンダー上のスケジュールの数カウント用の変数
for (j in event){
if (event[j].getTitle().substring(0, 1) == "◎"){
//スケジュール名の先頭1文字が「◎」の場合のみ取得
ash.getRange(i,1).setValue(event[j].getTitle()); //A列:イベントタイトル
ash.getRange(i,2).setValue(event[j].getStartTime()); //B列:イベント開始時刻
ash.getRange(i,3).setValue(event[j].getEndTime()); //C列:イベント終了時刻
ash.getRange(i,4).setValue("=round((rc[-1]-rc[-2])*24)"); //D列:所要時間
i += 1
}else{ //スケジュール名が条件を満たさない場合、何もせず次の繰り返し処理へ
}
}
}
if (event[j].getTitle().substring(0, 1) == "◎"){
substringメソッドを使用して、「一番左から数えて1文字目」を取得し、
「◎」である場合のみ、スケジュールを取得して各要素をA~D列に記載、という内容にしています。
4.ルールの周知徹底
今回はコード作成自体は簡単なものでしたが、
むしろ、多忙な営業メンバーに忘れずにスケジュール名の先頭を「◎」にしてもらう、
ルールを徹底してもらうためにはどうするか、という点の方がポイントになるように思います。
筆者の場合は、
・予定を取得・表示したスプシを営業メンバー自身が閲覧する場合、
見出しなど目立つ箇所に、Googleカレンダー上でのスケジュール作成の際のルールを記載する
・GASを用いて上記スプシを検索し、1週間(5営業日)以内に「◎」のある予定が一切入っていない
営業メンバーに対して、Slack等に自動でメッセージを投稿して警告する
等の対策を実践しています。