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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

0回答

467閲覧

GAS作成のHTMLをgoogleformに連携 回答の編集を許可

testtesttest11.

総合スコア4

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

1クリップ

投稿2023/04/08 11:41

編集2023/04/09 14:48

実現したいこと

GAS作成のHTMLをgoogleformに連携 回答の編集を許可させたいです。

https://qiita.com/hasehiro0828/items/a6f3442df80e826f8357
のようなことを実現したいですが、TypeScriptを利用したことがなく、資料を見てもよくわかりませんでしたので、GASを利用して同じようなことを実現しようと思います。

大まかな流れ

上記サイトを見ると
①GAS作成のHTMLを作成
②データ送信後に動くスプリプトを組む(メールで編集用URLを飛ばす)
③編集用URLにはsoreIDと回答のIDがついていて、IDをkeyに元の回答をスプレッドシートからとってきてHTMLに表示&formのactionを変更することで元データを編集
となっていました。

GASで同様にするために
①GAS作成のHTMLを作成
②データ送信後に動くスプリプトを組む(回答用スプレッドシートにIDをセット&メールで編集用URLを飛ばす)
③編集用URLには回答のIDがついていて、IDをkeyに元の回答をスプレッドシートからとってきてHTMLに表示&formのactionを変更することで元データを編集
としています

困っていること

①編集時に新しくレコードが追加される
formのactionに以下のように回答のIDを付与しているのですが、別レコードとして追加されます
あくまで編集なのでデータの上書きをしてほしいです
<form action="https://docs.google.com/forms/u/0/d/e/XXXX/formResponse?edit2=回答のID">

②編集時の初期値(selectとradio)
★★の部分
input type="text" にはvalueにスプレッドシートの値を設定できたのですが、selectの場合のやり方がわかりませんでした
どのようにcheckedを変更したらよいでしょうか

③困っていることというよりは疑問なのですが、
今のスクリプトだと送信時に、最終行を取得し最終行のA列にIDをセットしています。
複数人が同時に送信したとき実行タイミングによってずれが発生する可能性はありますでしょうか。もしそうであるならば回答内容をkeyにIDをセットしようと思います。

プログラム(HTML入力時のonchangeなどがまだ組み込めていません)

GAS

1function doGet(e) { 2 3// 表示したいHTMLのファイル名を指定(拡張子は不要) 4 test = HtmlService.createTemplateFromFile("index"); 5 return test.evaluate(); 6} 7 8function getreservedate(){ 9//?id=でURLに後ろついたパラメータのidを受け取る 10var id = e.parameter.id; 11//←testの時は一回テスト用にコメントアウトして、var id ="回答のID"を明記 12 13var sheetId = 'シートのID'; 14var sheetName = 'フォームの回答'; 15 16//formのactionは"https://docs.google.com/forms/d/e/XXXX/formResponse" 17//編集時のformのactionは"https://docs.google.com/forms/d/e/XXXX/formResponse?edit2=***" 18var act = "https://docs.google.com/forms/u/0/d/e/XXXX/formResponse"; 19 20 21//IDがなければ新規,ある場合は編集 22if (id == ""){ 23 var rowData = new Array(6); // 24 rowData.push(act); // 25 return rowData ; 26}else{ 27 //フォームの回答シートを取得 28 var SS = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName); 29 30 //回答シートを取得 31 var sheetDates = SS.getDataRange(); 32 33 //最終行を取得 34 var lastRow = sheetDates.getLastRow(); 35 36 //最終列を取得 37 var lastCol = sheetDates.getLastColumn(); 38 39 //id と一致する行を検索 40 for(var i = 0;i<lastRow-1;i++){ 41 //A列(ID列)と一致したらOK 42 if(sheetDates.getCell(i+2, 1).getValue() == id){ 43 //一致した行の必要な回答部分を取得 44 var rowData = SS.getRange(i+2,1,i+2,6).getValues(); 45 //form のactionの値を変更する 46 act = act + "?edit2=" + id; 47 //htmlへ引き渡すためにrowDataの値も追加する 48 rowData.push(act); 49 return rowData ; 50 } 51 } 52 53 54//ID付きのURLだが、一致しない場合 55 //最終行の下の行(=空白行のはず)をreturn 56 return SS.getRange(i+3,1,i+3,6).getValues(); 57 58} 59}

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 6 <title>予約サイト</title> 7 8 </head> 9 <body> 10 11 12 13 14<script> 15const onlyNumbers = n => { 16 return n.replace(/[0-9]/g,s => String.fromCharCode(s.charCodeAt(0) - 65248)).replace(/\D/g,''); 17} 18</script> 19 20<? var data = getreservedate(); ?> 21 22 23 24 <!-- <form action="https://docs.google.com/forms/d/e/XXXX/formResponse"> 25 --> 26 <form action="https://docs.google.com/forms/d/e/XXXX/formResponse"?edit2=***"> 27 <label for="status">ステータス-status</label><!-- ★★ <?= data[0][0]; ?>の値を入れたい--> 28 <input id="status" type="radio" name="entry.〇〇" value="新規" checked> 新規 29 <input id="status" type="radio" name="entry.〇〇" value="変更" > 変更 30 <input id="status" type="radio" name="entry.〇〇" value="キャンセル" > キャンセル 31<br> 32 <label for="email">メール</label> 33 <input id="email" type="email" name="entry.〇〇" value="<?= data[0][1]; ?>" required/> 34<br> 35 <label for="hiduke">予約日</label> 36 <input id="hiduke" type="text" name="entry.〇〇" value="<?= data[0][2]; ?>" required/> 37<br> 38 39 <label for="otona">人数(大人)</label> 40 <input id="otona" type="text" name="entry.〇〇" oninput="value = onlyNumbers(value)" value="<?= data[0][3]; ?>" max="10" required/> 41<br> 42 <label for="kodomo">人数(子供)</label> 43 <input id="kodomo" type="text" name="entry.〇〇" oninput="value = onlyNumbers(value)" value="<?= data[0][4]; ?>" max="5" required/> 44<br> 45 46<br> 47 <label for="kotu">交通手段</label><!--  ★★ <?= data[0][5]; ?>の値を入れたい--> 48 <select id="kotu" type="select" onchange="change(this)" name="entry.〇〇" value="<?= data[0][5]; ?>"required/> 49 <option>選択してください</option> 50 <option value="車">車</option> 51 <option value="公共交通機関">公共交通機関</option> 52 <option value="タクシー">タクシー taxi</option> 53 <option value="その他">その他(自転車、徒歩他)</option> 54 </select> 55<br> 56 <button type="submit" name="button" onclick="check()" value="送信"></button> 57 </form> 58 59 60 </body> 61</html> 62

GAS

1//編集用にIDをセット 2function setID(e){ 3var sheetId = 'シートのID'; 4var sheetName = 'フォームの回答'; 5 6//1_フォームの回答シートを取得 7var SS = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName); 8 9 10//2_最終行を取得 11var sheetDates = SS.getDataRange(); 12var lastRow = sheetDates.getLastRow(); 13var lastRowA = sheetDates.getCell(lastRow, 1); 14 15 16//最終行のA列にデータが入っていたら終了 17if(lastRowA.getValue() != ""){ 18Logger.log("上書き防止のため終了"); 19return 0; 20} 21 22//フォームIDを保存 23var formid = 'フォームID'; 24 25//回答データ一覧をフォームから取得 26var formDates = FormApp.openById(formid).getResponses(); 27 28//回答データ一覧をフォームから一番最後の編集用URL取得 29//var EditableUrl = formDates[Number(formDates.length - 1)].getEditResponseUrl(); 30 31//回答用URLを作成 32/var EditableStr = EditableUrl 33 34//IDのみ抽出 35var url_search = EditableStr.indexOf('edit2='); 36 //「&search=」を含む文字を抽出 37var url_txt = EditableStr.substring(url_search); 38var ID = url_txt.replace("edit2=", ""); 39 40//IDを最終のAセルへ実装 41lastRowA.setValue(ID); 42} 43 44//メールの送信 後ほど作成 45function sendmail(e){ 46 47}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問