【GAS】少しは成長?:スプレッドシートからカレンダーへ予定を登録

(2018.07.30 | コードを修正。)

Googleカレンダーの予定をメールで配信することにしたのは、すでに書いたとおり。この過程で《処理速度》ということを意識した私1

Pythonの勉強で、繰り返し配列の演習をしたことも少しは影響していたのだろうか、前に作ったコードを見て、冗長な部分をなくしたい思いに駆られる。

前に作ったものをシンプルにし、更にもう少しだけ便利にしてみようと書き直ししてみた。gistを直そうと思ったのだけど、前のコードがあまりにも汚くて、反対に「成長できてるんじゃない?」と思わせてくれるので、あれはあれでとっておくことにした。

 

変更点

出発点は、長くて汚いコードをシンプルにしたい、というもの。そのため、入力にフォームを使って云々といったところまで改良はしていない。ただ、もちろんもっと使いやすくしたいとは思っているので、その前段階として今回はカレンダーへの登録だけ不要なデータまで取得している。

以前のプログラムの概要

以前のコードは、9カラムの表に必要に応じてデータを登録するというもの。(自分で入力するのは、8)

  • イベントタイトル
  • 開始日
  • 開始時刻
  • 終了日
  • 終了時刻
  • 終日イベント判定
  • 説明(カレンダー本文)
  • 場所
  • カレンダーへの登録状況(自動入力される)

終日イベントかどうかは手動で判定。面倒くさい。

今回のプログラムの概要

今回は、カラム数が増えて10カラム。(自分で入力するのは、8)

  • イベントID(自動入力される)
  • スタッフの名前
  • 不在の種類
  • その他タイトルに入力する情報
  • 開始日
  • 開始時刻
  • 終了日
  • 終了時刻
  • 説明(カレンダー本文) (2018.07.03削除)
  • 場所 (2018.07.03削除)
  • カレンダーへの登録状況(自動入力される)

以前と今回のプログラムの違い

今回のプログラムは、個人で使うのではなく、メール配信しているカレンダーへの入力を意識したもの。前は明確なゴールがなかったので、あの出来も仕方がないと言えば仕方がない。

【イベントタイトルの入力を簡単に】

以前のプログラムでは、タイトルの整形も自力。今回は、カラムを分けて少しシンプルにしてみた。

例:

  • (以前)以下の項目をすべてタイピング 「(山田) 外出 XXXカンファレンス」
  • (今回)3つのカラムに内容を分けて入力 「山田」「外出」「XXXカンファレンス」 →「(山田) 外出 XXXカンファレンス」と自動的に整形される。

何だ、たいしたことないじゃないか。そのとおり。実は、後々、フォームを使っての入力を意識している。スタッフ名と不在の種類はドロップダウンにする予定。

【終日イベントの判定を自動に】

終日判定のカラムを削除。これは、他の入力データの内容から自動で判断させる。

【本当は不要:説明と場所】(→2018.07.30 全く使わないので削除)

GASの《.CreateAllDayEvent()》や《.CreateEvent()》でもオプションとなっている、説明と場所については、もはや私に取っては不要。(イベントタイトルだけをBotやメールでみんなに通知しているから) ただ、前回入れていたので、あくまでおまけで入れておいた。これを削除すると、以前より1つカラムは少なくなる。

【いつくるかわからない今後のために:イベントID】

イベントの修正をするプログラムを作ることを考えて、イベントID用のカラムを追加した。本当に使うときが来るのか疑わしいが。

カレンダーへの登録フロー

では、今回のプログラムを画像を使って説明。

1. データ入力

必要なデータを入力する。終日イベントの場合は、時刻の入力が不要。(必須入力項目未入力の場合の処理を入れていない点に注意。今後、改善の必要あり。)

2018-06-22_before_running_programme

2. プログラムの実行

前回のようにボタンを設置するのもいいが、時間をトリガーにすることを考えている。 はい、全て入力完了。

2018-06-22_Calendar_view

入力後は、下図のようにイベントIDと登録状況が自動更新される。

2018-06-22_after_running=programme

今となっては私には不要だが、場所と説明も反映されている。

2018-06-22_description_location

今回のコード

不要な部分を削除。タイトルの整形などを付け加えたものの、全体の長さは同じくらいにおさまった。

/* カレンダーへイベントを登録する */
function pushToCalendar() {
var dSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var myCal = CalendarApp.getCalendarById("XXXXXXXXX.google.com"); //<---XXXXXを自分のgmailアドレスへ変更する
// シートのデータを配列に格納する
var dSheetVals = dSheet.getDataRange().getValues();
var lastRow = dSheet.getLastRow();
//シートの2行目〜最終行まで処理を繰り返す
for (var i = 1; i < lastRow; i++) {
if (dSheetVals[i][8] ==='Posted') {
continue;
} else {
var schedule = {
staffName: dSheetVals[i][1],
descType: dSheetVals[i][2],
title: dSheetVals[i][3],
startDate: dSheetVals[i][4],
startTime: dSheetVals[i][5],
endDate: dSheetVals[i][6],
endTime: dSheetVals[i][7]
};
var evtTitle = '(' + schedule.staffName + ') ' + schedule.descType + ': ' + schedule.title;
var evtID;
if (schedule.startTime === '') {
var startDate = formatDateTime(schedule.startDate, 0, 0);
var endDate = formatDateTime(schedule.endDate, 1, 0);
// 終日イベント:1日だけの場合と複数日にわたる場合
if (endDate) {
evtID = myCal.createAllDayEvent(evtTitle, startDate, endDate);
} else {
evtID = myCal.createAllDayEvent(evtTitle, startDate);
}
} else {
// 終日イベント以外の処理
var startTime = formatDateTime(schedule.startDate, 0, schedule.startTime);
var endTime = formatDateTime(schedule.startDate, 0, schedule.endTime);
evtID = myCal.createEvent(evtTitle, startTime, endTime);
}
// 登録されたことを表示
dSheet.getRange(i + 1, 9).setValue('Posted');
// イベントIDの入力
dSheet.getRange(i + 1, 1).setValue(evtID.getId());
}
}
}
function formatDateTime(d, ed, t) {
if (t === 0 && ed === 0) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0);
} else if (t === 0 && ed === 1) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0);
} else {
return new Date(d.getFullYear(), d.getMonth(), d.getDate(), t.getHours(), t.getMinutes(), 0);
}
}
view raw pushToCalendar_2.gs hosted with ❤ by GitHub

変数の宣言の位置変更

VBAでは変数を一番最初に書くことが多く、前のプログラムではそれでいいような気がしていたが、最近は使う直前の宣言が多いので、そっちに変更した。

感想

まだまだ改良の余地はあるが、必要としているものに近づいた。たった数ヶ月前のことなのに、ここまで変えることになるとは考えもしなかった。どんなものが作れるのか、と手探りで作るのと、こういうものを作りたい、と作るのではこんなに違うものなのか。

今後はフォームを使った入力の簡易化や、登録済みデータの修正・古いデータの消去などのフローを検討してみたい。


  1. 「かわいいアプリ見つけたよ〜!」とウキウキな感じでメッセージ送ってきた友達(職業プログラマ)に「いやさ、今取り組んでるコードの処理速度がさ・・・」と切り返してひかれる事態。 ↩︎

This site uses Akismet to reduce spam. Learn how your comment data is processed.