フォームの「リストから選択」スタイルの質問をデータのリスト(スプレッドシートなど)にリンクする方法はありますか?
これは、スプレッドシートのリストに新しいオプションが追加されると(またはリストをホストできる場合はどこでも)、将来的にフォームで選択するオプションとして自動的に表示されることを意味します。
私の場合、フォームに記入した回答者は、ボランティアの包括的なリストからその特定のボランティアセッションに参加しているボランティアを選択できることを意味します(各名前を個別に入力するのではなく)が、ボランティアは散発的に参加するため、毎回新しいオプションを手動で追加するのではなく、リストのオプションにこれらを自動的に追加できる場合、非常に役立ちます。
これが可能かどうかはわかりませんが、誰かがそれを行う方法を提案できれば本当に感謝しています。
Tom Horwoodの答えは素晴らしいですが、彼のコードの重要なエラーを修正して初めてです。 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を初めて使用する人向け)。上記のコードスニペットでシート名とフォームフィールド名を参照して、わかりやすくすることを願っています。
フォームに関連付けられているスプレッドシートで:
TaskCategories
)。そのワークシートの最初の列にアイテムのリストを配置します。そのシートの余分な列と行をすべて削除します(これは必要な場合とそうでない場合があります-テストされていません)FORMID
の値は、フォームのIDに変更する必要があります。 IDは、目的のフォームのブラウザのURLバーにある長いコード(スラッシュの間)です。LIST_DATA
変数は、フォームとニーズに合わせて変更する必要があります。 LIST_DATA
の各アイテムはformFieldTitle
とworksheetName
のタプルであることに注意してください。前者はフォームフィールドの名前(「リストから選択」タイプのフィールドでなければなりません)-フォームエディターではQuestion Title
と呼ばれます。後者は、以前に作成したワークシートの名前で、フィールドに入力するアイテムのリストが含まれています。これらのタプルを必要なだけリストに追加します。スプレッドシートに戻ると、List Updater
という新しいメニュー項目が表示されます。リストワークシートを変更するたびに実行する必要があるUpdate Lists
という項目が1つあります。それに応じてフォームが更新されます。
また、読者の利益のために、FormRangerは新しいGoogleスプレッドシートでは動作しないことに注意してください。 FormRangerの開発者は、彼らのウェブサイトで同じように言っています。おそらく/願わくばそれは将来変更されるでしょうが、この投稿の時点で上記のコードは私のために機能し、私はそれをクライアント用にデプロイされた形で使用しています。
これは、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);
}
Form Values と呼ばれるGoogle Formsアドオンがあり、少なくとも半自動の方法を提供します。スプレッドシートで回答を変更するたびに、回答の選択肢を手動で再入力する必要がありますが、少なくともそれはやや簡単です。
通常のGoogleフォームではこれを行えません。
ただし、 Google Apps Script 、特に IService を使用して独自のGUIを作成できます。ただし、GUI全体を再作成する必要があることに注意してください。既存のフォームの一部を使用することはできません。
または、 GUI Builder を使用できます。これは、Google Apps Script GUI用のWYSIWYGエディターです。
どちらを選んだとしても、あなたが望むものを達成するためのプログラミングを行う準備をする必要があります。
FormRangerというスクリプトがあります: https://docs.google.com/document/d/1YvgrxeZJNb2CBpSra1j59Mh1bVpk4vBQYLOoyVjby7A/edit?hl=ja&forcehl=1