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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

860閲覧

GAS googleフォーム経由googleカレンダー反映後の修正処理について

gigs

総合スコア1

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/03/27 14:20

前提・実現したいこと

Googleフォームで出席・欠席申告フォームを作成しgoogleカレンダーに反映するプログラムを作成しております。 (初心者です)

Googleフォームからgoogleカレンダーに反映することはできたのですが、
ある人が当初、出席する予定だったのを欠席に変更した場合、出席の行を削除して
欠席の情報を入れられず困っています。

どなたかご教示いただけないでしょうか?

<googleカレンダー 予定の詳細(例)>

山田 太郎 出席 車 => OK
鈴木 一郎 午前のみ参加 車 => OK 
山田 太郎 欠席 車 => NG

↑ googleフォームから入力後、山田太郎さんが出席だったのを欠席にした場合、出席の行を自動で削除したい。

よろしくお願いいたします。

該当のソースコード

GAS

1var CALENDAR_ID = “xxxxxxxxxxxxxxxxxx”; 2var EVENT_TITLE = “yyyyyyy_パパ欄"; 3 4var ITEM_KEY_DATE = "予定日"; 5var ITEM_KEY_PLAYER = "パパ名"; 6var ITEM_KEY_CONTENT = "内容"; 7var ITEM_KEY_CAR = "車出し"; 8var ITEM_KEY_MEMO = "伝言"; 9 10/** 11 * カレンダーにイベントを追加する 12 * @param e 13 */ 14function addCalendar(e) { 15 // 入力項目の取得 16 var responses = e.response.getItemResponses(); 17 var messages = []; 18 var items = {}; 19 var date = null; 20 for (var i=0; i<responses.length; i++) { 21 var response = responses[i]; 22 var key = response.getItem().getTitle(); 23 var value = response.getResponse(); 24 25 if (key==ITEM_KEY_DATE) { 26 date = value.replace(/-/g, "/"); 27 items[key] = getDate(new Date(date)); 28 } else { 29 messages.push(value); 30 items[key] = value; 31 } 32 } 33 34 /// 既に予定があるかを確認する 35 var scheduled_date = new Date(date); 36 var calendar = CalendarApp.getCalendarById(CALENDAR_ID); 37 var events = calendar.getEventsForDay(scheduled_date); 38 var description = ""; 39 for (var i=0; i<events.length; i++) { 40 var event = events[i]; 41 var title = event.getTitle(); 42 //var player = ITEM_KEY_PLAYER 43 if (title == EVENT_TITLE) { 44 45 description = event.getDescription() + "\n" + messages.join(" "); 46 event.setDescription(description); 47 48 49 break; 50 } 51 } 52 53 //予定が無い場合は新規作成 54 if (!description) { 55 calendar.createAllDayEvent(EVENT_TITLE, scheduled_date, {description:messages.join(" ")}).setGuestsCanSeeGuests(false); 56 } 57 58} 59 60function getDate(date) { 61 var d = []; 62 d.push(date.getFullYear()); 63 d.push(date.getMonth()+1); 64 d.push(date.getDate()); 65 return d.join('/'); 66} 67

試したこと

/// 既に予定があるかを確認するの行の
description = event.getDescription() + "\n" + messages.join(" ");の下に
以下の文を入れて見たのですが、うまく行きませんでした。

var splitText = description.split("\n"); // 改行毎に抜き出す
for (var n=0; n<splitText.length; n++) {
for (var x=1; x<splitText.length - n; x++) {
if (splitText[n].substr(1,3)== splitText[n+x].substr(1,3)) {
splitText.splice(n,1); // 削除的ななにか
break;            //
}
}
}

//description = splitText.replace(",","\n")

event.setDescription(splitText);
ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

全角スペース区切りで最初が名前だとして、その名前が該当する場合
全て削除というのであれば

GAS

1 description=event.getDescription(); 2 var lines=description.split("\n"); 3 lines=lines.filter(function(line){ 4 sp=line.split(" "); 5 if (sp[0]=="山田 太郎"){ 6 return false 7 } else { 8 return true 9 } 10 }) 11 description = lines.join("\n") + "\n" + messages.join(" ") 12

このような感じでしょうか。
名前の部分は、itemsに格納されていると思うのでそれを使えばいいと思います。

(追記 2021/03/28)
filterがわかりにくいかもしれないので、filter使わないで書くと以下のようになります。

GAS

1 description=event.getDescription(); 2 var lines=description.split("\n"); 3 var newlines=[] 4 for (const line of lines){ 5 sp=line.split(" "); 6 if (sp[0]!=messages[0]){ 7 newlines.push(line) 8 } 9 } 10 description = newlines.join("\n") + "\n" + messages.join(" ")

名前の所もコードから推測するとmessages[0]と思われるので変えました。

投稿2021/03/27 23:56

編集2021/03/28 06:34
xail2222

総合スコア1506

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

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

gigs

2021/03/28 05:14

xail2222さんありがとうございます。 今参考に入れてみたのですが、以下のようになって削除されませんでした。 yyyyyyy_パパ欄 3月 27日 (土曜日)⋅午前8:00~午後5:00 説明:鈴木 一郎 午前のみ参加 車 => OK  佐藤 二郎 全日参加 車 => OK   山田 太郎 午後のみ参加 車 => NG test 山田 太郎 午前のみ参加 車 => NG test5 山田 太郎 欠席 車 => NG test6 30 分前 主催者: yyyyyyy_Info さん yyyyyyy_Info 入れる場所間違っていますか? /// 既に予定があるかを確認する var scheduled_date = new Date(date); var calendar = CalendarApp.getCalendarById(CALENDAR_ID); var events = calendar.getEventsForDay(scheduled_date); var description = ""; for (var i=0; i<events.length; i++) { var event = events[i]; var title = event.getTitle(); var player = ITEM_KEY_PLAYER if (title == EVENT_TITLE) { description = event.getDescription() + "\n" + messages.join(" "); event.setDescription(description); description=event.getDescription(); var lines=description.split("\n"); lines=lines.filter(function(line){ sp=line.split(" "); if (sp[0]==items){ return false } else { return true } }) description = lines.join("\n") + "\n" + messages.join(" ") break; } }
xail2222

2021/03/28 06:15

if (title == EVENT_TITLE) {   <ここ> event.setDescription(description); break; } 入れる場所は、上述の通りです。 また、itemsとそのまま渡していますが items[key]という形でキーを指定しないといけないと思います。 keyはフォームに設定された内容なので何かは私にはわかりません。 まぁkeyが不明ならmessages[0]でもいいと思います。
gigs

2021/03/28 06:59

xail2222さん ありがとうございます。 filter使用しない方で行ったら上手く削除できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問