
Googleフォームで日付のアンケートを取っているのですが,その日付をスプレッドシートから読み込ませ,毎月アンケートの日付を変えるのを楽にしたいと思っています。
下記のコードをとにかく並べてみて動かしているのですが,あと少しのところでうまくいきません。
(ドドド素人が書いていますので,ぐちゃぐちゃですがお許しください)
流れとしては,
①スクリプトを実行すると,日付を載せているシートから日付を読み取りフォーム側に上書き
②フォームの日付を上書きすると,回答シートの後ろにどんどん列が増設されていくので,
③一旦,フォームの回答が集まるシート「Aスタッフの回答」シートのリンクを解除
④「Aスタッフの回答」シートを削除し,新たにシートを作りフォームと再リンク
⑤新たに作り再リンクさせたシートの名前を「Aスタッフの回答」にする
がしたいです。
しかし,下記のコードを実行すると,
⑤がうまくいきません。
Googleフォームは再リンクを繰り返すと,新たに作られるシート名が「フォームの回答 2」→「フォームの回答 3」→「フォームの回答 4」・・・と,どんどん数字が大きくなります。
そこの部分の対策ができていないのか,シート名が変わらず「フォームの回答 〇〇」(数字)になってしまいます。
色々と調整しながら試していたのですが,シート名の重複エラーが出て無理だった時もありました...
そして,今に至っています......
どのようにコードを書き直したら良いのかが分からず困っております...
初心者で何も分からずすみません。ここまでできたことが奇跡でもあります......
途中で諦めているので,最後の方はぐちゃぐちゃかもしれません。
整理もまだしていないので,お許しください。
Googleフォームの質問は,
名前
7日間の日付のチェックボックス
備考欄
7日間の日付のチェックボックス
備考欄
になっています。
//フォームの日付を上書き function NewDay() { //スプレッドシートのID var sheetid = "XXXXXXXXXXXXXXXXXX"; //スプレッドシートを取得 var sheet = SpreadsheetApp.openById(sheetid).getSheetByName("Aスタッフの回答"); //早朝:日付リストを取得する var data = sheet.getRange("A2:A").getValues(); var dlength = data.length; //1次元配列として作り直す var array = []; for(var i = 0;i<dlength;i++){ if(data[i][0] == ""){ //空白の時は何もしない }else{ array.push(data[i][0]); } } //アクティブフォームを取得する var formId = "XXXXXXXXXXXXXXXXXXX"; var form = FormApp.openById(formId) // 質問項目がチェックボックスのもののみ取得 var items = form.getItems(FormApp.ItemType.CHECKBOX_GRID); items.forEach(function(item){ //対象のグリッドパーツを見つける if(item.getTitle().match(/早朝.*$/)){ //質問セクションを取得する var question = item.asCheckboxGridItem(); //選択肢を上書きする question.setRows(array); } }); //夕方:日付リストを取得する var data2 = sheet.getRange("C2:C").getValues(); var dlength2 = data2.length; //1次元配列として作り直す var array2 = []; for(var i = 0;i<dlength2;i++){ if(data2[i][0] == ""){ //空白の時は何もしない }else{ array2.push(data2[i][0]); } } //アクティブフォームを取得する var formId2 = "XXXXXXXXXXXXXXXXXXXXXXXX"; var form = FormApp.openById(formId2) // 質問項目がチェックボックスのもののみ取得 var items = form.getItems(FormApp.ItemType.CHECKBOX_GRID); items.forEach(function(item){ //対象のグリッドパーツを見つける if(item.getTitle().match(/夕方.*$/)){ //質問セクションを取得する var question2 = item.asCheckboxGridItem(); //選択肢を上書きする question2.setRows(array2); } }); //////////////////// //フォームとのリンクを解除// //////////////////// // フォームオブジェクト var form = FormApp.openById(["XXXXXXXXXXXXXXXXXXXXXX"]); // 回答先スプレッドシートを格納しているフォルダ var folder = ["XXXXXXXXXXXXXXXXXXXX"]; // 回答先スプレッドシートを取得する var old_ss = SpreadsheetApp.openById(sheetid); // 回答先リンクを外す form.removeDestination(); // フォームに残っている回答を削除 form.deleteAllResponses(); ////////////////// //シートの削除スクリプト// ////////////////// //あらかじめ削除したくないシート名を記載してください。例「["シート1","シート5","シート10"]」 const notDelSheet = ["名簿シート","アドレスシート","勤務状況"]; // 現在アクティブなスプレッドシートを取得 let mySheet = SpreadsheetApp.getActiveSpreadsheet(); //取得したスプレッドシートにある全てのシートを配列として取得 let sheetData = mySheet.getSheets(); //末尾のシートを削除するかを決めるフラグ let flag =0; //forループでシートを削除する削除を行う for(i=0;i<sheetData.length;i++){ //削除したくないシート存在しない場合、末尾のシートは削除せずスキップする if(flag ==0 && i == sheetData.length-1){ break; } //削除対象から除外するシートにヒットした場合は、削除処理は行わず、フラグを立てる if(notDelSheet.indexOf(sheetData[i].getSheetName()) != -1){ flag = 1; } //削除除外シートではない場合は、削除処理を実行する else{ mySheet.deleteSheet(sheetData[i]); } } // スプレットシート取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId()); // シート名を変更 var sheets = ss.getSheets(); /** * 有効な新規シート名を取得します。 return: シート名 */ return('Aスタッフの回答') for (var i = 0; i < sheets.length; i++) { var name = sheets[i].getName(); if (name.indexOf('Aスタッフの回答') != -50 &&name.indexOf(sheetName) == -1) { if( !existsSheetAs(sheetName) ) sheets[i].setName(sheetName); for(x = 1; existsSheetAs(sheetName = sheetName + '_' + ++x); ) continue; return sheetName; } } /** * 指定の名称のシートが存在するかどうかを判定 * param1: シート名 * return: 存在する場合はtrue、そうでない場合はfalse */ function existsSheetAs(sheetname) { var sheet = spreadSheet.getSheetByName(sheetname); return (sheet != null); }


回答1件
あなたの回答
tips
プレビュー