(2018.07.30 | コードを修正。)
Googleカレンダーの予定をメールで配信することにしたのは、すでに書いたとおり。この過程で《処理速度》ということを意識した私1
Pythonの勉強で、繰り返し配列の演習をしたことも少しは影響していたのだろうか、前に作ったコードを見て、冗長な部分をなくしたい思いに駆られる。
前に作ったものをシンプルにし、更にもう少しだけ便利にしてみようと書き直ししてみた。gistを直そうと思ったのだけど、前のコードがあまりにも汚くて、反対に「成長できてるんじゃない?」と思わせてくれるので、あれはあれでとっておくことにした。
Contents
変更点
出発点は、長くて汚いコードをシンプルにしたい、というもの。そのため、入力にフォームを使って云々といったところまで改良はしていない。ただ、もちろんもっと使いやすくしたいとは思っているので、その前段階として今回はカレンダーへの登録だけ不要なデータまで取得している。
以前のプログラムの概要
以前のコードは、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. データ入力
必要なデータを入力する。終日イベントの場合は、時刻の入力が不要。(必須入力項目未入力の場合の処理を入れていない点に注意。今後、改善の必要あり。)
2. プログラムの実行
前回のようにボタンを設置するのもいいが、時間をトリガーにすることを考えている。 はい、全て入力完了。
入力後は、下図のようにイベントIDと登録状況が自動更新される。
今となっては私には不要だが、場所と説明も反映されている。
今回のコード
不要な部分を削除。タイトルの整形などを付け加えたものの、全体の長さは同じくらいにおさまった。
/* カレンダーへイベントを登録する */ | |
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); | |
} | |
} |
変数の宣言の位置変更
VBAでは変数を一番最初に書くことが多く、前のプログラムではそれでいいような気がしていたが、最近は使う直前の宣言が多いので、そっちに変更した。
感想
まだまだ改良の余地はあるが、必要としているものに近づいた。たった数ヶ月前のことなのに、ここまで変えることになるとは考えもしなかった。どんなものが作れるのか、と手探りで作るのと、こういうものを作りたい、と作るのではこんなに違うものなのか。
今後はフォームを使った入力の簡易化や、登録済みデータの修正・古いデータの消去などのフローを検討してみたい。
- 「かわいいアプリ見つけたよ〜!」とウキウキな感じでメッセージ送ってきた友達(職業プログラマ)に「いやさ、今取り組んでるコードの処理速度がさ・・・」と切り返してひかれる事態。 ↩︎
You must log in to post a comment.