前提・実現したいこと
GASで、googleカレンダーから一括で過去のデータを引っ張ってきて、スプレッドシートに出力させようとしています。
スプレッドシートに出力する際に、エラーメッセージが発生しました。
エラー内容は、以下の通りです。
発生している問題・エラーメッセージ
Exception: データの行数が範囲の行数と一致しません。データは 657 行ですが、範囲は 18137.行です。
該当のソースコード
JavaScript
1// 参考URL : https://note.com/w_yoshida/n/n84b5fcbccb2b 2 3var ss = SpreadsheetApp.getActiveSpreadsheet(); 4var listEventSheet = ss.getSheetByName("イベント一覧取得"); 5var updateEventSheet = ss.getSheetByName("イベント更新"); 6//実行メニューを作成 7function onOpen() { 8 var ui = SpreadsheetApp.getUi(); 9 var menu = ui.createMenu("GAS実行"); 10 menu.addItem("イベント取得", "listEvent"); 11 menu.addItem("イベント更新", "modifyEvent"); 12 menu.addToUi(); 13} 14function listEvent(){ 15 var today = new Date(); 16 var tmpDate = new Date(); 17 var newDateMonth = tmpDate.getMonth() - 3; 18 var newDateYear = tmpDate.getYear(); 19 if (newDateMonth == 0) { 20 newDateMonth = 12 21 newDateYear = newDateYear - 1; 22 } 23 if (newDateMonth == -1) { 24 newDateMonth = 11 25 newDateYear = newDateYear - 1; 26 } 27 if (newDateMonth == -2) { 28 newDateMonth = 10 29 newDateYear = newDateYear - 1; 30 } 31 if (newDateMonth < 10) { 32 newDateMonth = '0' + newDateMonth; 33 } 34 var pastDate = newDateYear + '/' + newDateMonth + '/01 00:00:00'; // 3ヶ月前の日付 35 var memberId = [ // 指定したいカレンダーIDを配列に入れる 36 '*****@group.calendar.google.com', 37 '*****@group.calendar.google.com' 38 '*****@group.calendar.google.com' 39 '*****@group.calendar.google.com' 40 '*****@group.calendar.google.com' 41 '*****@group.calendar.google.com' 42 '*****@group.calendar.google.com' 43 '*****@group.calendar.google.com' 44 '*****@group.calendar.google.com' 45 ]; 46 47 var lastColum = listEventSheet.getLastColumn(); 48 var lastRow = listEventSheet.getLastRow(); 49 var startRow = 5; 50 var dataColumnCount = 9; 51 var dataCount = 0; 52 //イベントを取得する対象のカレンダーIDを取得 53// for(var m = 0; m < memberId.length; m++) { // memberId がオブジェクト配列だから、 forで回さないといけない 54// var calendar = CalendarApp.getCalendarById(memberId[m]); //指定したIDのカレンダーを取得 55// var schedules = calendar.getEventsForDay(today); 56 57 //シートのリスト出力部をクリア 58 listEventSheet.getRange(startRow, 1, listEventSheet.getLastRow(), dataColumnCount).clear(); 59 60 //予定の一覧(今日〜3か月前までの分)を取得 61 //停止ユーザーのカレンダーを指定してもエラーになるので注意 62 for(var k = 0; k < memberId.length; k++) { 63 var eventList = Calendar.Events.list(memberId[k], { 64 timeMin: new Date(pastDate).toISOString(), 65 timeMax: new Date().toISOString(), 66 singleEvents: false, 67 //orderBy: "startTime", //"orderBy"は"singleEvents"がtrueでないと使用できない 68 maxResults: 2500 //APIの上限は2500 69 }); 70 71 var values = []; 72 if(eventList){ 73 for(var i = 0; i < eventList.items.length; i++){ 74 75 //まれに予定ではないレコードが含まれるので、"htmlLink"が存在しないレコードはスキップする 76 if(!eventList.items[i].htmlLink) 77 { 78 continue; 79 } 80 81 var value = []; 82 var strDate = ''; 83 var strStartTime = ''; 84 85 //終日予定の場合は"event.start.date"を、通常の予定の場合は"event.start.dateTime"を保持している 86 if(eventList.items[i].start.dateTime){ 87 var startDate = new Date(eventList.items[i].start.dateTime); 88 //var startDate = eventList.items[i].start.dateTime; 89 90 //getMonthは0~11を返すので1を加算 91 var strMonth = startDate.getMonth() + 1; 92 93 94 //"時"の頭0が省略されるので付与 95 var strHour = startDate.getHours(); 96 if(strHour < 10){ 97 strHour = '0' + strHour; 98 } 99 100 //"分"の頭0が省略されるので付与 101 var strMinute = startDate.getMinutes(); 102 if(strMinute < 10){ 103 strMinute = '0' + strMinute; 104 } 105 106 strDate = startDate.getFullYear() + '-' + strMonth + '-' + startDate.getDate(); 107 strStartTime = strHour + ':' + strMinute; 108 } 109 else 110 { 111 strDate = eventList.items[i].start.date; 112 } 113 114 value.push(strDate); 115 value.push(strStartTime); 116 value.push(eventList.items[i].summary); 117 value.push(eventList.items[i].organizer.email); 118 value.push(eventList.items[i].visibility); 119 value.push(eventList.items[i].guestsCanModify); 120 value.push(eventList.items[i].recurrence); 121 value.push(eventList.items[i].recurringEventId); 122 value.push(eventList.items[i].id); 123 124 values.push(value); 125 dataCount++; 126 } 127 128 values.sort(); 129 } 130 } 131// } 132 //取得したデータをスプレッドシートにセット 133 listEventSheet.getRange(startRow, 1,dataCount, dataColumnCount).setValues(values); 134} 135 136
試したこと
最後の一文のdataCountを、values.lengthに変更してみました。その場合、カレンダーIDが入っている配列、memberIdの一番最後のデータのみ取り出され出力されてしまう結果となりました。
//取得したデータをスプレッドシートにセット listEventSheet.getRange(startRow, 1, values.length, dataColumnCount).setValues(values);
補足情報(FW/ツールのバージョンなど)
お手上げ状態なので、何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー