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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

2回答

1448閲覧

googleカレンダーに、内容が重複するものを避けながら複数の予定を追加したい

inarichang

総合スコア11

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

1クリップ

投稿2019/05/25 11:05

前提・実現したいこと

管理用のgoogleカレンダーからeventに関する情報を抜き出し、公開不可能な情報(場所と説明)を削除した上で、公開用のカレンダーにコピーするスクリプトを作成しようとしています。
転記するところまでは問題なく進んでいますが、現状だとスクリプトが起動する度に全ての予定がコピーされてしまい、同じ予定が重複して作られてしまいます。
以下のコードに何かを追加することによって、全く同じ時間・同じ内容のものを避けながら、createventしていくことはできないでしょうか。

だいぶ初歩的な質問かもしれませんが、何卒よろしくお願いします。

該当のソースコード

GAS

1function createEvents() { 2 var to_show = CalendarApp.getCalendarById('calendarA@group.calendar.google.com'); 3 var values = CalendarApp.getCalendarById('calendarB@group.calendar.google.com'); 4 var events = values.getEvents(new Date('2017/10/01'), new Date('2019/10/07')); 5 6 for (var i=0; i < events.length; i++) { 7 var title = events[i].getTitle(); 8 var startTime = events[i].getStartTime(); 9 var endTime = events[i].getEndTime(); 10 //単位の変換も同時に 11 var duration = (endTime - startTime) / (1000 * 60 * 60); 12 //var option = { 13 //description: events[i].getDescription(), 14 //location: events[i].getLocation() 15 //} 16 to_show.createEvent(title, startTime, endTime); 17 } 18}

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

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

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

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

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

guest

回答2

0

自己解決しました。
calendarBの中身を全て毎回削除するようにし、その後calendarAからcalendarBにイベントをコピーすることで、目的を達成できました。
よく考えれば当然のことですが、質問の時点では思い当たらず・・・回答してくださったpapinianus様ありがとうございました。

投稿2019/06/09 00:52

inarichang

総合スコア11

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

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

papinianus

2019/06/10 08:42

質問者さまにおかれましては、全部消して全部作るで、いいのかもしれませんが、普通そういう設計にはしませんね。
guest

0

ベストアンサー

件数によってはカレンダーだけで管理していくのはつらそう。
タイトルが一意であるとか、作ったものはかえないとか、現在より古いものは触らないとか、運用の具体状況にあわせて仕組みをかえたほうがよさそう

あと↓では、getEventsが開始時刻でソートした順序で結果を返すことを前提にしていますが、ドキュメントをみても判然としませんでした。
運用含め分かる人にコンサルテーションしてください

javascript

1function q191327() { 2 const startTime = new Date("2017/10/01"); 3 const endTime = new Date("2019/10/07"); 4 const dstId = "calendarA@group.calendar.google.com"; 5 const srcId = "calendarB@group.calendar.google.com"; 6 const dstCal = CalendarApp.getCalendarById(dstId); 7 const srcEvents = CalendarApp.getCalendarById(srcId).getEvents( 8 startTime, 9 endTime 10 ); 11 const dstEvents = dstCal.getEvents(startTime, endTime); 12 const size = srcEvents.length; 13 for (var i = 0, cur = undefined; i < size; i++) { 14 var event = srcEvents[i]; 15 var start = event.getStartTime(); 16 while ((cur = dstEvents.shift) && (curStart = cur.getStartTime())) { 17 if (curStart < start) { 18 continue; 19 } 20 break; 21 } 22 var end = event.getEndTime(); 23 var title = event.getTitle(); 24 if ( 25 cur && 26 curStart === start && 27 cur.getEndTime() === end && 28 cur.getTitle() === title 29 ) { 30 continue; 31 } 32 if (cur) { 33 dstEvents.unshift(cur); 34 } 35 dstCal.createEvent(title, start, end); 36 } 37}

投稿2019/05/30 08:52

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問