前提・実現したいこと
複数のgoogleカレンダーの情報をスプレッドシートに取り込みたい。
発生している問題・エラーメッセージ
こちらの記事を参考にしているのですが
https://qiita.com/Bzbot/items/b92ca277ad95b7b4cf89
エラー:引数が無効です var calenderId = sheet.setActiveSheet(sheet.getSheetByName("Calender_ID"));
と表示されます。
スプレッドシートの名前をCalender_IDにコピペしてスクリプト実行すると、
次のエラー
TypeError: null のメソッド「getEvents」を呼び出せません。
var calendarId = sheet.setActiveSheet(sheet.getSheetByName("Calendar_ID"));
となります。
該当のソースコード
//対象の日付を範囲指定
var date = '2020/01/01';
//アクティブなシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet();
//「Calendar_ID」のシートをアクティブにして、シート情報をcalendarIdに取得
var calendarId = sheet.setActiveSheet(sheet.getSheetByName("Calendar_ID"));
//「Calendar_Item」のシートをアクティブにして、シート情報をcalendarItemに取得
var sheet1 = SpreadsheetApp.getActiveSpreadsheet();
var calendarItem = sheet1.setActiveSheet(sheet1.getSheetByName("Calendar_Item"));
//現在の入力されてる値を初期化
calendarItem.clear();
//ヘッダ行に入る値を指定(誤って削除しても都度指定)
calendarItem.getRange('A'+(1)).setValue('カレンダーID');
calendarItem.getRange('B'+(1)).setValue('タイトル');
calendarItem.getRange('C'+(1)).setValue('開始時刻');
calendarItem.getRange('D'+(1)).setValue('終了時刻');
calendarItem.getRange('E'+(1)).setValue('所要時間');
calendarItem.getRange('F'+(1)).setValue('詳細');
calendarItem.getRange('G'+(1)).setValue('住所');
//CalendarIDが入っている最終行を取得(固定)
var lastR1 = calendarId.getLastRow();
Logger.log("【lastR】:" + lastR1);
//セットされているIDのリストを順番に取得してgetCalに引数として渡す
for (var i = 1; i < lastR1 ; i++){
//予定表が入っている最終行を取得(可変)
var lastR2 = calendarItem.getLastRow();
Logger.log("【lastR】:" + lastR2);
//カレンダーIDを指定して、カレンダーを取得 var calId = calendarId.getRange('A'+(i+1)).getValue(); Logger.log('【calId】' + calId); getCal(calId,lastR2);
}
}
function getCal(id,lastR) {
Logger.log('【id】' + id);
Logger.log('【lastR】' + lastR);
var calendar = CalendarApp.getCalendarById(id);
//この時はまだfrom,end両方に変数dateで指定した日付が入っている
var from= new Date(date);
var end = new Date(date);
//月を指定するときは必ず大文字のMMを指定します(半角mmだとminutesを指してしまう)
//endのMonthm(月)に+1をして翌月を指定
end.setMonth(end.getMonth()+1);
//getEventsで取得したいカレンダーの始まりと終わりを指定
var events = calendar.getEvents(from, end);
//eventsに入っている要素の数だけ実行
for (var i = 0; i < events.length; i++) {
Logger.log('events要素' + i + '目');
var title = events[i].getTitle();
var startTime = events[i].getStartTime();
var endTime = events[i].getEndTime();
var duration = (endTime - startTime) /(1000*60)/(60);
var detail = events[i].getDescription();
var location = events[i].getLocation();
//取得した値をスプレッドシートに反映 calendarItem.getRange('A'+(lastR+1)).setValue(id); calendarItem.getRange('B'+(lastR+1)).setValue(title); calendarItem.getRange('C'+(lastR+1)).setValue(startTime).setNumberFormat('yyyy/mm/dd hh:mm'); calendarItem.getRange('D'+(lastR+1)).setValue(endTime).setNumberFormat('yyyy/mm/dd hh:mm'); calendarItem.getRange('E'+(lastR+1)).setValue(duration); //calendarItem.getRange('E'+(lastR+1)).setValue(detail); calendarItem.getRange('G'+(lastR+1)).setValue(location); lastR = lastR + 1;
}
}
### 試したこと まったくどうしたらよいかわからず迷走しております。 みなさま、助けてください。 ### 補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー