とはいえ、インターバルの大きいメンテナンスは忘れがちです。スマホアプリでも作ってみようかと思いましたが、データはどこに保存する?機種変したら消える?PCやタブレットでも見るには?と考えるとハードルが高い…ということで、Googleスプレッドシートにリストを作って、実行するとGoogleカレンダーに一括登録してくれるスクリプトを組みました。
CalendarAppの操作、カレンダーの追加・削除、定期イベントの作成方法について解説するので、参考になさってください。


スクリプトのコード
function putMyTaskToCalendar() {
///// SheetWrapper Class ver.1.0 without tableTopRowShift Light/////
// sheetId:スプレッドシートのURLからIdを指定
// sheetName:スプレッドシートのシート名
var SheetWrapper = function(sheetId, sheetName){
this.sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
var values = this.sheet.getDataRange().getValues();
this.currentY = 1; // 行方向ポインタ
this.maxX = values[0].length;
this.maxY = values.length;
// 列項目名->列毎データの連想配列を作成
this.columns = {};
for(var c = 0; c < this.maxX; c++){
var item = values[0][c]; // 列項目名
this.columns[item] = [c + 1]; // 先頭に列番号を格納
for(var r = 1; r < this.maxY; r++){
this.columns[item].push(values[r][c]);
}
}
};
// 表操作関数
SheetWrapper.prototype = {
getByItem : function(itemName){
return this.columns[itemName][this.currentY];
},
moveNext : function(){this.currentY++;},
EOF : function(){
return this.currentY >= this.maxY;
}
};
///////////////////////////////////////////////////////////////////
/// MAIN ///
const THIS_CALENDAR_NAME = 'myTaskByGAS';
const SHEET_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var taskSheet = new SheetWrapper(SHEET_ID, 'MAIN');
// delete and create calender
var calendars = CalendarApp.getCalendarsByName(THIS_CALENDAR_NAME);
if(calendars.length > 0){
calendars[0].deleteCalendar();
}
var calendar = CalendarApp.createCalendar(THIS_CALENDAR_NAME);
// create events
while(!taskSheet.EOF()){
var title = taskSheet.getByItem('作業内容');
var startDate = new Date(taskSheet.getByItem('開始日'));
var endDate = new Date(taskSheet.getByItem('終了日'));
var interval = taskSheet.getByItem('頻度(値)');
var recurrence;
switch(taskSheet.getByItem('頻度(単位)')) {
case '日':
recurrence = CalendarApp.newRecurrence().addDailyRule()
.interval(interval)
.until(endDate);
break;
case '週':
recurrence = CalendarApp.newRecurrence().addWeeklyRule()
.interval(interval)
.until(endDate);
break;
case '月':
recurrence = CalendarApp.newRecurrence().addMonthlyRule()
.interval(interval)
.until(endDate);
break;
case '年':
recurrence = CalendarApp.newRecurrence().addYearlyRule()
.interval(interval)
.until(endDate);
break;
}
calendar.createAllDayEventSeries(title, startDate, recurrence);
taskSheet.moveNext();
}
}
スクリプトの解説
SheetWrapper Class
以前作成した(リンク)、スプレッドシートを配列に格納し、列名検索やmoveNextで回せるクラスです。もうね、これは何列目とか、配列のインデックスだから0から始まるとか、覚えてられない年頃なのです(笑)。
setValue等は使わないので、省きました。クラス(function)を共有するにはライブラリ化という手もありますが、ちょこちょこといじるので、それぞれのFunction内に書く形にしています。
SheetWrapperの初期設定
SheetWrapperは、IDとシート名で初期設定を行います。IDはブラウザでスプレッドシートのURLを見て、
https://docs.google.com/spreadsheets/d/xxxxxx/edit#gid=0
xxxxxxの部分をコピペします。
CalendarApp.getCalendarsByName(), deleteCalendar(), createCalendar()
Googleカレンダーは、Gmailに紐づいたマイカレンダーに、「日本の祝日」「誕生日」などの予定を重ねて表示できます。デフォルトのマイカレンダーは、getDefaultCalendar()で取得できますが、ここにイベントを追加すると、後で消す時に面倒なので、新しいカレンダーを作成することにしました。表示するには、アプリやブラウザの設定でチェックを付けます。
カレンダーにはユニークな名前を付けます。本来、カレンダーの名前はユニークである必要が無く、IDがユニークであればいいため、getCalendarsByName()はカレンダーを配列として返します。しかし、IDは確認が面倒で使い辛いため、「他で使わなそうな名前」をユニークな値として使うことにします。また、そのカレンダーを削除してから新たに追加することで、リストを空にすると予定を全消去できるようにしました。
※自分以外のカレンダー(他人や、別のGmailアドレス)に追加・削除はできない仕様です
SheepWrapperの行毎処理
スプレッドシートをSheetWrapperに入れてしまえば、最終行などの判定不要で、whileとmoveNextで1行ずつ処理できます。
while(!taskSheet.EOF()){
//処理
taskSheet.moveNext();
}
recurrenceの作成
recurrenceは繰り返すを表すオブジェクトです。この後でイベントを作成しますが、その引数に使用します。CalendarApp.newRecurrence()で作成し、ピリオドで繋いで下記オプションを加えていきます。
- addDailyRule() (Weekly, Monthly, Yearly)
- interval(interval)
- until(endDate)
createAllDayEventSeries(title, startDate, recurrence)
引数の準備はできているので、実行すれば定期的なイベントがカレンダーに追加されます。こちらは終日イベントですが、時間指定するcreateEventSeries()もあります。今回は時間が重要でないので、前者を使いました。また、引数にoptionsオブジェクトを加えると、場所などの詳細情報を登録できます。
シート作成のTips~データの入力規制&図形にスクリプトを登録
データの入力規制
頻度の単位については、switch文で分岐しているので、想定外の値を入力されると動作しません。そこで、「日、週、月、年」のみ入力できるよう、データの入力規制を追加します。
- 入力規制を追加したい範囲を選択
- メニュー データ → データの入力規制
- リストを直接指定
- コンマ「,」区切りで値を入力
図形にスクリプトを登録する
スクリプトの実行は、コード入力画面からもできますが、普段使うには面倒です。
そこで、スプレッドシートの図形にスクリプトを割り当てます。これはExcelにもある機能ですね。
図形を作成した後、右上の「...(縦)」ボタンを押し、スクリプトを割り当てをクリックします。ここで、function名(function xxxxxxxxxxxxx()の部分)をコピペで入力します。選択できないのが面倒な仕様ですが。
まとめと展望
プラグなどは、距離数に応じて交換となりますが(でも車の一生に2回程度だろう)、この表では指定できません。年間走行距離を入力し、おおよその期間を計算できれば、インターバルを計算できるでしょう。
先にも書きましたが、スクリプト毎、用途毎にカレンダーを作成し、重ねて表示する仕様をおすすめします。プログラムのミスで大量の予定を作ってしまうと、悲惨なことになりますので。
0 件のコメント:
コメントを投稿