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

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

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

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

Google フォーム

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

Google Apps Script

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

解決済

Googleフォームの日付をスプシから読み込む

shopp_life
shopp_life

総合スコア3

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

1回答

0評価

0クリップ

275閲覧

投稿2022/07/04 12:14

編集2022/07/07 06:25

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); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

qnoir

2022/07/06 11:59 編集

コードを読むと「Aスタッフの回答」というシート、つまりフォームの回答を集めているシートから回答者のタイムスタンプを読み取り、その日時をチェックボックスに設定しようとしているように見えるのですが、これは正しいのでしょうか? チェックボックスに設定する日付は「Aスタッフの回答」というシートではなく、別の名前のシートから読み取るのではないですか? というのは質問文には 「フォームの内容は 名前 7日間の日付のチェックボックス 備考欄 7日間の日付のチェックボックス 備考欄 」 となっていますが、上記のように回答者のタイムスタンプを新たにチェックボックスの回答欄に設定してしまうと、チェックボックスの数は不定になる気がするからです。
shopp_life

2022/07/06 12:05

ありがとうございます。 ご指摘の通り,フォームの日付は「日付」シートから読み取るようにしています。 書き間違いでした....正しくは下記ですね。 var sheet = SpreadsheetApp.openById(sheetid).getSheetByName("日付");

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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