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

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

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

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

Google カレンダー

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

Google Apps Script

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

Q&A

解決済

2回答

3153閲覧

googleフォームからカレンダーへの予定登録が不安定です

gatten1217

総合スコア59

Google フォーム

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

Google カレンダー

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/09/05 00:55

編集2020/09/09 08:12

社内ツールとして、googleフォームに入力するとスケジュール登録できるようにしています。

正確には、googleフォーム→スプレッドシート→googleカレンダーという流れで、スプレッドシートからgoogleカレンダーに登録する部分をgasで記述し、フォーム送信時にトリガーを設定しています。
動作確認はできているのですが、フォーム送信してもカレンダーに反映されないケースが散見されます。

・スプレッドシートには反映されていることから、フォーム送信は間違いなくできていること
・一度失敗しても、同じ内容で送信し直すと登録されたりすること

以上の状況から、
1,通信環境の問題
2,コードに問題
のどちらかかと思っています。1の方が可能性は高いと思っていて、鉄筋コンクリート造の建物のため電波が届きにくく、社内wifiも場所によっては不安定です。

皆様に伺いたいのは、コードの内容に本当に問題がないかということと、その他の可能性がないかということです。

↓コード

google

1function createEvent() { 2 var calendar = CalendarApp.getCalendarById("ID"); 3 var spreadsheet = SpreadsheetApp.openById("ID"); 4 var scheduleSheet = spreadsheet.getSheetByName("予定作成"); 5 var lastRow = scheduleSheet.getLastRow(); 6 var title = scheduleSheet.getRange(lastRow,2).getValue(); 7 var startTime = scheduleSheet.getRange(lastRow,3).getValue(); 8 var endTime = scheduleSheet.getRange(lastRow,4); 9 var description = scheduleSheet.getRange(lastRow,6); 10 var options = {description: description.getValue()} 11 12 if(description.isBlank() && startTime < endTime.getValue()){ 13 calendar.createEvent(title, startTime, endTime.getValue()); 14 }else if(description.isBlank() && endTime.isBlank()){ 15 calendar.createAllDayEvent(title, new Date(startTime.getFullYear(),startTime.getMonth(),startTime.getDate(),0,0,0)); 16 }else if(endTime.isBlank()){ 17 calendar.createAllDayEvent(title, new Date(startTime.getFullYear(),startTime.getMonth(),startTime.getDate(),0,0,0), options); 18 }else{ 19 calendar.createEvent(title,startTime,endTime,options) 20} 21}

![フォーム入力画面]

スプレッドシート画面
(一部黒塗りしています)

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

追記
·このスクリプトはフォームに記載しています

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

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

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

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

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

macaron_xxx

2020/09/09 05:40

このスクリプトは、フォームまたはスプレッドシートのどちらに記載されていますか?
gatten1217

2020/09/09 08:11

ご質問ありがとうございます。 フォームに記載しています。
guest

回答2

0

フォームのトリガーに設定している場合、スプレッドシートに値が書き込まれる前にスクリプトが実施されている可能性がありますので、送信された値をフォームの送信内容から取得する必要があります。

下記のようなスクリプトで実行できるかと思います。

js

1function createEvent(e) { 2 const calendar = CalendarApp.getCalendarById("ID"); 3 const res = {}; 4 5 const itemResponse = e.response.getItemResponses(); 6 itemResponse.forEach(response => { 7 const title = response.getItem().getTitle(); 8 const value = response.getResponse(); 9 switch(title) { 10 case '予定の名前': 11 res.title = value; 12 break; 13 case '開始日時': 14 res.startTime = value; 15 break; 16 case '終了日時(省略可)': 17 res.endTime = value; 18 break; 19 case '予定の詳細(省略可)': 20 res.description = value; 21 break; 22 } 23 }); 24 25 const options = res.description ? {description: res.description} : {}; 26 27 if (res.endTime) { 28 calendar.createEvent(res.title, res.startTime, res.endTime, options); 29 } else { 30 calendar.createAllDayEvent(res.title, new Date(res.startTime.getFullYear(),res.startTime.getMonth(),res.startTime.getDate(),0,0,0), options); 31 } 32}

投稿2020/09/09 23:19

macaron_xxx

総合スコア3191

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

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

gatten1217

2020/09/11 05:52

ありがとうございます!直接取得できるのは知りませんでした! 質問を2つさせてください ・こちらのスクリプトはスプレッドシート側に記述、トリガーは必要なし、でOKですか? ・下から8行目 const options = res.description ? {description: res.description} : {}; のような記述の仕方は初めて見ました。どこか参考になるページをご存知でしたら教えて下さい。
gatten1217

2020/09/11 14:01

三項演算子を使うとずいぶん見た目がスッキリしますね!スゴイ! いただいたスクリプトをコピペして実行してみたところ、エラーが発生してしまいました。 パラメータ(String,String,String,(class))が CalendarApp.Calendar.createEvent のメソッドのシグネチャと一致しません。 at makeEvent(コード:53:14) というエラー文が表示されています。 res.startTimeとres.endTimeが文字列型になっているのがおかしいのかと思い、new Dateに渡してみたりしたのですが、うまくいきませんでしたorz
guest

0

ベストアンサー

wifiが不安定であれば、フォーム送信時のトリガーはお勧めできません。
フォームからSSに書き込みができても、カレンダーへの予定登録の処理が不安定のせいで途中で終わってしまってる可能性があります。
対策としては
・フォーム送信時ではなく時間主導型にして5分おきの間隔で処理をする。
・回答シートにカレンダー登録ステータスの項目を追加して、
空欄であればそのレコードをカレンダーに登録する処理を実行して完了したら「済み」とフラグを立てるロジックを作る。

そうすることでwifi不安定に関わらず、5分間隔でフラグの状況をみて処理してくれます。

投稿2020/09/09 10:02

yo-takata

総合スコア30

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

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

macaron_xxx

2020/09/09 23:08

GASはGoogleのサーバー上で実行されますので、フォーム送信者のネットワークに左右されません。
gatten1217

2020/09/11 05:54

ありがとうございます。初心者にもとてもわかりやすい内容でした。 どちらの方法も試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問