質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1259閲覧

GAS : 最後の一文が原因でエラー発生。googleカレンダーからスプレッドシートに出力する

nanainu

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/10/11 23:26

編集2020/10/11 23:36

前提・実現したいこと

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/ツールのバージョンなど)

お手上げ状態なので、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanainu

2020/10/11 23:36

ご指摘ありがとうございます!
guest

回答1

0

ベストアンサー

ざっと見た限りでは コード上で、

for(var k = 0; k < memberId.length; k++) {

のループ内に var values = [] の記述があるのが良くなさそうです。

これだとmemberId毎に values がリセットされてしまい、forループを抜けて 書き込むときには最後の memberId分しか残ってない状態です。

エラーメッセージで データ(valuedsのサイズ)が 、行の範囲(dataCount) より大幅に小さい数なのもその為です。

var dataCount = 0; の下あたりに、var values = [] を移動してみてください。

投稿2020/10/12 01:05

編集2020/10/12 01:07
sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanainu

2020/10/12 01:18

おっしゃった通りに修正したら、解決しました!! わかりやすいご説明で大変助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問