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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

972閲覧

Googleカレンダーの終日イベント以外の全てのイベントをスプレッドシートに取り込みたい

Sou23

総合スコア38

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2021/03/15 07:24

編集2021/03/15 08:15

前提・実現したいこと

Googleカレンダーの終日イベント以外の全てのイベントをスプレッドシートに取り込みたいです。

発生している問題・エラーメッセージ

同一のイベントが複数回取り込まれます。

該当のソースコード

GAS

1function myFunction() { 2 3 var calender = CalendarApp.getCalendarById('***@gmail.com'); 4 5 var starttime = new Date(); 6 starttime.setHours(0); 7 starttime.setMinutes(0); 8 starttime.setSeconds(0); 9 10 var endtime = new Date(); 11 endtime.setHours(23); 12 endtime.setMinutes(59); 13 endtime.setSeconds(59); 14 15 var events = calender.getEvents(starttime,endtime); 16 var values = []; 17 18events.forEach(function(event){ 19var title = event.getTitle(); 20var start = event.getStartTime(); 21var allday = event.isAllDayEvent(); 22if(allday !== true){ 23 24var description = event.getDescription(); 25values.push([title,start,description]); 26 27var ss = SpreadsheetApp.getActiveSpreadsheet(); 28var sheet = ss.getSheetByName("シート1") 29var lastRow = sheet.getLastRow()+1; 30sheet.getRange(lastRow,1,values.length,values[0].length).setValues(values); 31} 32} 33) 34} 35

試したこと

if文をなくすと複数回取り込まれないようです。
もしif文を使わずに終日イベント以外を全て取り込む方法があれば、そちらでも構いません。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

GAS

1 var values = []; 2 // 略 3 events.forEach(function(event){ 4 // 略 5 values.push([title,start,description]); 6 7 var ss = SpreadsheetApp.getActiveSpreadsheet(); 8 var sheet = ss.getSheetByName("シート1") 9 var lastRow = sheet.getLastRow()+1; 10 sheet.getRange(lastRow,1,values.length,values[0].length).setValues(values); 11 }

イベントをループする毎にvaluesのデータが増えていきvaluesを毎回書き込んでいますね。

つまり、一つ目のイベントでのループでは、valuesは一つ目のイベントの情報がセットされており
一つ目のイベントの情報を書き込みます。

二つ目のイベントでのループでは、valuesは一つ目と二つ目のイベントの情報がセットされており
一つ目のイベントの情報と二つ目のイベントの情報を書き込みます。

2回ループするだけでも、一つ目のイベントの情報が2回書き込まれていますね。

(追記)
valuesに情報をためて行ってるのだから次のような感じでいいんじゃないでしょうか。

GAS

1 var values = []; 2 // 略 3 events.forEach(function(event){ 4 // 略 5 values.push([title,start,description]); 6 } 7 var ss = SpreadsheetApp.getActiveSpreadsheet(); 8 var sheet = ss.getSheetByName("シート1") 9 var lastRow = sheet.getLastRow()+1; 10 sheet.getRange(lastRow,1,values.length,values[0].length).setValues(values);

投稿2021/03/15 14:45

編集2021/03/15 15:01
xail2222

総合スコア1497

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

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

Sou23

2021/03/16 02:08

ありがとうございます!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問