web-dev-qa-db-ja.com

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

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

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

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

これが可能かどうかはわかりませんが、誰かがそれを行う方法を提案できれば本当に感謝しています。

10
andy

Tom Horwoodの答えは素晴らしいですが、彼のコードの重要なエラーを修正して初めてです。 LIST_DATA要素へのすべての参照は、インデックスjiではなく)を使用して作成する必要があります。私はトムの投稿にコメントするのに十分なカルマを持っていないので、ここに完全にモンティがあります:

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

また、読者の利益のために、FormRangerは新しいGoogleスプレッドシートでは動作しないことに注意してください。 FormRangerの開発者は、彼らのウェブサイトで同じように言っています。おそらく/願わくばそれは将来変更されるでしょうが、この投稿の時点で上記のコードは私のために機能し、私はそれをクライアント用にデプロイされた形で使用しています。

3
allnatural

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

この例で使用したサンプルコードを次に示します sheet および form

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);
}
2
Tom Horwood

Form Values と呼ばれるGoogle Formsアドオンがあり、少なくとも半自動の方法を提供します。スプレッドシートで回答を変更するたびに、回答の選択肢を手動で再入力する必要がありますが、少なくともそれはやや簡単です。

1
kynan

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

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

または、 GUI Builder を使用できます。これは、Google Apps Script GUI用のWYSIWYGエディターです。

どちらを選んだとしても、あなたが望むものを達成するためのプログラミングを行う準備をする必要があります。

0
Vidar S. Ramdal
0
Trendmatcher

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

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

次に、add a new trigger。特定の例では、updatesListを設定してfrom spreadsheetおよびOn form submissionを実行できます。この方法では、関数onOpenは必要ありません。

0