web-dev-qa-db-ja.com

Apps Scriptを使用して、ライブGoogleフォームで複数の選択肢を動的に編集します

私はロサンゼルスの高校の教師で、AppsScriptを使用してコース登録システムを作成しようとしています。この登録に使用しているGoogleフォームが必要です。

質問1)生徒の現在の回答の選択肢に基づいて、新しいページの後続の多肢選択問題で利用可能な選択肢を更新します。

質問2)複数選択オプションが「上限」に達したときに、フォームから選択肢を削除します。

質問1例)学生はワークショップ1で「タイタイイング」に登録し、新しいページに移動します。スクリプトは、生徒の最初の選択肢に基づいてその新しいページで利用可能な選択肢を編集し、その新しいページで可能な選択肢のリストから「抱き合わせ」を削除するため、残りの選択肢は「エチケット」だけです。

質問2例)学生は「抱き合わせ」または「エチケット」のいずれかに登録できます。どちらの回答も最初はGoogleフォームで入手できます。 30人の学生が調査に参加し、30人全員が「タイタイイング」ワークショップに登録します。 Apps Scriptは応答スプレッドシートを参照し、「抱き合わせ」ワークショップがいっぱいであることを認識してから、Googleフォームの可能な選択肢のリストから削除します。学生31は登録に行き、彼らの唯一の選択肢は「エチケット」です。

私の質問がすでに尋ねられ、答えられている場合(私を信じて、私は検索しました!)、リダイレクトをいただければ幸いです。

8
user2752213

現在の対応状況に応じて、難なく第2の目標を達成し、フォームを変更できると思います。

アプローチは

  1. フォームを作成し、回答スプレッドシートに関連付けます
  2. その応答スプレッドシートで、関数(たとえばupdateForm)を使用してスクリプトを作成します
  3. その関数をonFormSubmitイベントにバインドします。 コンテナ固有のインストール可能なトリガーの使用 を参照してください。
  4. UpdateForm関数で応答を分析し、フォームサービスを使用してフォームを変更します

例えば

function updateForm(e) {
  if (e.values[1] == 'Yes') {
    Logger.log('Yes');
    var existingForm = FormApp.openById('1jYHXD0TBYoKoRUI1mhY4j....yLWGE2vAm_Ux7Twk61c');
    Logger.log(existingForm);
    var item = existingForm.addMultipleChoiceItem();
     item.setTitle('Do you prefer cats or dogs?')
     .setChoices([
         item.createChoice('Cats'),
         item.createChoice('Dogs')
      ])
     .showOtherOption(true);
  }
}

最初の質問で目標を達成することになると、フォームが途中で送信されないため、より繊細になります。可能なことは、多肢選択問題へのさまざまな回答に基づいてさまざまなページに移動することです。ユースケースはこの方法に適合する可能性がありますが、それほど動的ではありません。

さらに、htmlサービスを使用して完全に動的なエクスペリエンスを作成することも可能です。

さらに詳しい情報が必要な場合はお知らせください。

4
patt0

フォームの送信時を除いて、フォームの入力中にサービスとスクリプトの間に相互作用がないため、Googleフォームサービスを使用してこのタイプの動的フォームを作成することはできません。複数ページのフォームの場合、スクリプトには、学生が1つのページを完了して別のページに進んだことを知る方法がありません。

ただし、HtmlServiceまたはUiServiceを使用してこれを実現できます。いずれの場合も、サーバーサイドスクリプトを介して対話するクライアント側のフォームを使用して、コースオプションの更新されたリストを取得し、次の「ページ」を変更します。複雑になります。

3
Mogsdad

この質問に対するもう1つの回答は、フォームが送信されるたびに複数選択の選択肢を追加し続けることです。同様のアプローチを使用する:

  1. フォームを作成し、回答スプレッドシートに関連付けます
  2. その応答スプレッドシートで、関数(たとえばupdateForm)を使用してスクリプトを作成します
  3. その関数をonFormSubmitイベントにバインドします。コンテナ固有のインストール可能なトリガーの使用を参照してください。
  4. UpdateForm関数で応答を分析し、フォームサービスを使用してフォームを変更します

次のコードを使用して、複数の選択肢に対して簡単に変更できるリスト選択を変更しました。

function updateForm(){
  var form = FormApp.openById('YOUR_FORM_ID'); // Base form  
  // need to read what dates are available and which are taken
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var dates = doc.getRange("dates!A1:A10").getValues(); //available options
  var taken_dates = doc.getRange("responses!F2:F51").getValues(); //just getting first 50 responses 
  // joining the taken dates into one string instead of an array to compare easier
  var taken_dates_string = taken_dates.join("|");

  var choice = [];
  // loop through our available dates
  for (d in dates){
    // test if date still available
    if (dates[d][0] != "" && taken_dates_string.indexOf(dates[d][0]) === -1){ 
      choice.Push(dates[d][0]); // if so we add to temp array
    }
  }
  var formItems = form.getItems(FormApp.ItemType.LIST); // our form list items
  // assumption that first select list is the one you want to change
  // and we just rewrite all the options to ones that are free
  formItems[0].asListItem().setChoiceValues(choice); 
}
2
mhawksey