Googleフォームの「リストから選択」スタイルの質問をデータのリスト(スプレッドシートなど)にリンクする方法はありますか?


10

フォームの「リストから選択」スタイルの質問をデータのリスト(スプレッドシートなど)にリンクする方法はありますか?

これは、スプレッドシートのリストに新しいオプションが追加されたとき(または他の場所でリストをホストできる可能性がある場合)、将来的にフォームで選択するオプションとして自動的に表示されることを意味します。

私の場合、フォームに記入する回答者は、特定のボランティアセッションに参加したボランティアを、(個々に名前を入力するのではなく)ボランティアの包括的なリストから選択できることを意味しますが、ボランティアは散発的に参加するため、毎回新しいオプションを手動で追加するのではなく、リストのオプションにこれらを自動的に追加することができれば、非常に役立ちます。

これが可能かどうかはわかりませんが、誰かがそれを行う方法を提案できたら本当にありがたいです。


悪いことに、あなたは与えられたすべての答えを見るために周りにいません...
Jacob Jan Tuinstra

回答:


3

トム・ホーウッドの答えはうまくいきますが、彼のコードの重要なエラーを修正した後でのみです。LIST_DATA要素へのすべての参照は、インデックスj(を使用しないi)を使用して行う必要があります。トムの投稿にコメントするのに十分なカルマがないので、ここに完全にモンティがあります:

以下は修正されたコードです。また、LIST_DATA要素の名前を変更して、もう少しわかりやすくしました。また、トムがどのように考えているかを示し(kudos!)、複数のスプレッドシートリストの内容で複数のフォーム要素を更新する機能を提供しました。

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

これを機能させる方法を要約します(私のように、初めてGoogle Apps Scriptを使用するユーザー向け)。上記のコードスニペットでシート名とフォームフィールド名を参照して、わかりやすくしました。

  1. フォームに関連付けられているスプレッドシートで:

    • 新しいワークシートを作成します。これには、フィールドに追加するアイテムのリストが含まれます。ワークシートに適切な名前を付けます(たとえば、TaskCategories)。そのワークシートの最初の列にアイテムのリストを配置します。そのシートの余分な列と行をすべて削除します(これは必要かどうかにかかわらず、テストされていません)。
    • [ツール]メニューから[スクリプトエディタ]を選択します。上記のコードスニペットをコピーしてスクリプトエディターに貼り付けます。スクリプトの次の部分を変更する必要があります。
      • variableの値をFORMIDフォームのIDに変更する必要があります。IDは、ブラウザーのURLバーにある目的のフォームの(スラッシュの間の)長いコードです。
      • LIST_DATA変数は、フォームやニーズに合わせて変更する必要があります。の各項目LIST_DATAformFieldTitleおよびのタプルであることに注意してくださいworksheetName。前者はフォームフィールドの名前です(これは「リストから選択」タイプのフィールドでなければなりません)-フォームエディタではと呼ばれQuestion Titleます。後者は、以前に作成したワークシートの名前であり、フィールドに入力する項目のリストが含まれています。これらのタプルを必要な数だけリストに追加します。
      • スクリプトを保存します(保存アイコンをクリックします)
      • スクリプトエディターメニューから[実行]を選択し、[updateLists]を選択して、スクリプトをテストします。初めてこれを行うと、許可を求められます。スクリプトが成功した場合は、フォームに指定されたフィールドが入力されていることを確認できます。そうでない場合は、画面にエラーメッセージが表示されます。
  2. スプレッドシートに戻ると、というタイトルの新しいメニュー項目が表示されList Updaterます。Update Listsリストのワークシートを変更するたびに実行する必要がある項目が1つあります。それに応じてフォームが更新されます。

また、読者のために、FormRangerは新しいGoogleスプレッドシートでは機能しないことにも注意してください。FormRangerの開発者たちは、Webサイトでも同じように言っています。多分/できればそれは将来的に変更されるでしょうが、この投稿の時点で上記のコードは私にとってはうまくいき、私はそれをクライアントのデプロイされたフォームで使用しています。


これは、スクリプトまたは何かを関連付ける経験のない人のために、段階的に含めるための素晴らしい答えだと思います。また、jsコードのフォーマットを厳しくするには、LIST_DATA配列の初期化の後にセミコロンを追加します。ヘッダー列がある場合のように、さらにカスタマイズするには、「for(var i = 1; i <data.length; i + = 1){//インデックスを1から開始してヘッダー行をスキップする」を使用します。
ゲイリー

欠落しているセミコロンを修正するために編集されました-通知に@Garyに感謝します:-)
allnatural

2

これを行うには、通常のフォームとスクリプトを使用し、Form.getItems()を使用して、ループ内のアイテムを検索してから、Item.asListItem()。setChoices(...)

これは、このサンプルシートフォームで使用したサンプルコードです。

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

フォームのリンクが修正されました
Tom Horwood、2013年

1

フォームの値と呼ばれるGoogleフォームアドオンがあり、少なくとも半自動の方法を提供しています。スプレッドシートで回答を変更するたびに、回答の選択肢を手動で再入力する必要がありますが、少なくとも簡単に行うことができます。


0

通常のGoogleフォームではこれを行うことはできません。

ただし、Google Apps Script、特にUIServiceを使用して独自のGUIを作成できます。ただし、GUI全体を再作成する必要があることに注意してください。既存のフォームのパーツは使用できません。

または、GUIビルダーを使用することもできます。これは、Google Apps Script GUIのWYSIWYGエディターです。

どちらを選択する場合でも、プログラミングを実行して、希望どおりの結果を得る準備をする必要があります。


1
GUIビルダーは廃止されたので、もう使用しません。
Jacob Jan Tuinstra 2013年

UIServiceも非推奨です。
ルベン2017

0

そのためのFormRangerというスクリプトがあります。https://docs.google.com/document/d/1YvgrxeZJNb2CBpSra1j59Mh1bVpk4vBQYLOoyVjby7A/edit?hl = ja&forcehl = 1


リンクされたスプレッドシートのデータが変更されるたびに、このスクリプトを手動で再実行する必要があることに注意してください!
kynan

0

Trigger [ 1 ] [ 2 ]をに設定することで、リストの更新を自動化する方法がありUpdate Listsます。

パスはスクリプトエディター->リソース->現在のプロジェクトのトリガーです

その後、add a new trigger。指定された例では、updatesList実行from spreadsheetおよびに設定できますOn form submission。この方法では、関数onOpenは必要ありません。


-1

はい、それは可能であり、一日の大部分を費やして答えを見つけ、それを私の目的のために開発しましたが、それは可能です。

私が必要とするのは、ボランティアしたい分野のリストから複数のボックスをチェックするためのボランティア登録フォームを用意することでした。したがって、複数のボックスがある1つの質問、問題は、結果のGoogleスプレッドシートがチェックしたすべてを1つのセルにリストしただけであるということです。21のボランティアオプションがあったので、それは明らかにその情報にとって有用なフォーマットではありません。私はあなたがあなたが望んでいるとあなたが言うことをあなたが理解したことをしたかった、私はそれ自身の列に21のオプションのそれぞれの列を持ちたかった。次に、タイムスタンプ(フォームが生成されます)、名前、電子メール、および電話の横に、「はい」または空白のままの21列があります。列見出しは、ユーザーが選択できる各オプションです。「はい」または「いいえ」の21の質問だけがなぜあるのか疑問に思う方もいるでしょう。

まず、誰かがgoogleフォームに入力すると、結果のスプレッドシートはデータを次の空の行に追加するのではなく、行を挿入します。これは、その行にあった数式はすべてバンプされ、その数式からの新しいデータには、入力データを処理するための次の2つの数式がないことを意味します。これを超えるために、スプレッドシート(​​ワークブック)にシートを追加しました。http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKwで brettathdsからの入力を利用したので、この2番目のシートのセルA1に= ARRAYFORMULA(Sheet1!A1:A)という数式を挿入しました。列Eから列Eまで同様に行いました。列Eには、21のチェックボックスに関する質問があります。

引き続き2枚目のシートでは、列FYの行1に、ボランティアが喜んで提供する領域のチェックリストの各チェックボックスオプションのテキストと同じヘッダーがありました。次に、列Zがフォームの次の最後の質問でした。これは、「追加コメント」というタイトルの短いテキストの質問でした。その列では、= ARRAYFORMULA(Sheet1!F1:F)を使用しました。これは、チェックボックスの質問の最後にある「その他」のオプションを利用するのではなく、別の質問としてこれを行いました。データをスプレッドシートに出力します。

次に、列Eのセル(21個までの項目がリストされる可能性があります)から情報を取得して「はい」または単に空白で列を分離する方法を回答する部分に進みます。2番目のシートのF2の数式は、= iferror(if(search(F $ 1、$ E2)> 0、 "Yes"、))です。この数式は、列ヘッダー(F1)の正確なテキストが見つかるかどうかを調べていますE2の場合は、「はい」を返し、そうでない場合は空白のままにします。

F2で参照されているこの数式は(F4キーを介して「$」を使用して)書き込まれるため、G2から行2の各セルにF2をコピー/貼り付けることができます(Googleスプレッドシートでは、ドラッグ/コピーによる数式のコピーはサポートされていませんExcelでは、F2、CTRL + C、G2:Y2、CTRL + Vの順に選択することで実行できます。次に、F2:Y2からF3:Y100に貼り付けた同じ方法論のコピーを利用します。

次に、2番目のシートの列Eを非表示にして、結果のスプレッドシートをよりコンパクトにした(長い回答からのすべての折り返しを回避した)。

これで、99人のボランティアがすばやく簡単なフォームに記入する準備が整いました。列の上部にあるフィルターオプションを使用すると、どの領域で誰が利用可能かを確認することもできました。

私が解決しなかった最後の欲求不満。数式とデザインをテストするためにいくつかの偽のフォームを完成させ、リンクされたスプレッドシートからそれらの行を削除しました。フォームを複製した人も何人かいて、行も削除しました。プロダクトフォーラムで注目に値するのは、Googleが「応答の概要」(スプレッドシートの「フォーム」タブにあります)に配線されたテスト/偽/重複データがまだ何らかの形で残っていることを知って挫折したのは私だけではありません。したがって、テスト/偽/重複フォームからデータを削除するために削除された行がある場合、応答の要約は正確性のために役に立ちません。

しかし、それは達成されており、次回同様のものが必要になったときのためにこれらのメモを保存しています。次回は30分未満で簡単に実行できると確信しています。

これがお役に立てば幸いです。質問がある場合はお知らせください。


2
それはたくさんのテキストです。
Jacob Jan Tuinstra 2013年

努力に対する
称賛
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.