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

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

ただいまの
回答率

90.76%

  • Google Apps Script

    718questions

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

GASで、googleフォームの「質問」に対するラジオボタンの「選択肢」を取得する方法を知りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 529

T.Nakagawa

score 2

 前提・実現したいこと

こちらの記事を参考に、

[Googleフォームで回答数により選択肢を変更する]
https://yukaobu.wordpress.com/2016/10/23/googleform-2/

Googleフォームで、上限付きの申込フォームを作っています。

こちらの方法だと、「質問」に対する「選択肢」を変更するたびに、GASも変更しなければいけません。

これを自動化したいです。

上記の例で言いますと、

フォーム内の「質問」、「参加する時間」に対するラジオボタンの選択肢「13時〜」、「14時〜」、「15時〜」を「14時〜」、「15時〜」、「16時〜」と変更した場合、GASも変更する必要があります。

 該当のソースコード

思惑としては、フォームの「質問」に対する「選択肢」を取得して、申込内容を格納している「answer」と比較すれば良いのではないかと考えています。

ただ、googleフォームの「質問」に対するラジオボタンの「選択肢」を取得する方法が、いくら探してもわからず質問させていただきました。

アドバイスいただきたいです。

function endFormCheck() {
  var LIMIT_COUNT = 10; //ここで席数上限を設定
  var ANSWER_LENGTH = 3; //時間帯の数
  var answerCount = [0,0,0];//カウント用:時間帯の数分配列を準備します
  var itemID = 0;

  var form = FormApp.getActiveForm(); //アクティブフォームを取得

  var formResponses = form.getResponses(); // 全回答内容を取得

  for (var i = 0; i < formResponses.length; i++) {
   var formResponse = formResponses[i]; // 回答ひとつ分を取得
   var itemResponses = formResponse.getItemResponses(); // 質問項目を取得

   for (var j = 0; j < itemResponses.length; j++) { // 回答内容をひとつずつチェック
     var itemResponse = itemResponses[j];
     var question = itemResponse.getItem().getTitle();
     var answer = itemResponse.getResponse();
     if(question == '参加する時間'){ // 申込み数カウント
       if(answer == '13時〜'){ answerCount[0]++; }
       else if( answer == '14時〜'){ answerCount[1]++; }
       else if( answer == '15時〜'){ answerCount[2]++; }
     }
    }
  }

  // LIMIT_COUNTになっている選択肢があるかチェック
  var answerCheck = 0;
  var choiceArray = [];
  var arrayCount = 0;
  for(var i = 0; i < ANSWER_LENGTH; i++){
        if(answerCount[i] == LIMIT_COUNT){
          answerCheck++;
       }
       else{ // LIMIT_COUNTになっていない選択肢は残す
         if ( i == 0 ){ choiceArray[arrayCount] = '13時〜'; arrayCount++; }
         else if( i== 1 ){choiceArray[arrayCount] = '14時〜'; arrayCount++;}
         else if( i== 2 ){choiceArray[arrayCount] = '15時〜'; arrayCount++;}
       }
    }

    // 全てLIMIT_COUNTなら申込みフォームを受付終了
    if(answerCheck == ANSWER_LENGTH){
        form.setAcceptingResponses(false);
    }

    // LIMIT_COUNTになっていない選択肢を「参加する時間」の選択肢に設定する
    if( (answerCheck != ANSWER_LENGTH) && (answerCheck >= 1)){
    var items = form.getItems();
    for (var i= 0; i< items.length; i++ ){
      var item = items[i];
      if( item.getTitle() == '参加する時間' ){
        var choice = item.asMultipleChoiceItem().getChoices();
        item.asMultipleChoiceItem().setChoiceValues(choiceArray);
      }
    }
  }
}

 試したこと

ライブラリから「FormApp」で取得できそうで、上記ソースコードで使っているので、できそうなきがするのですが、具体的にどのように記述したら良いか、わかりませんでした。
https://developers.google.com/apps-script/reference/forms/form-app

ここに問題に対して試したことを記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

 「質問」に対するラジオボタンの「選択肢」を取得する方法

前提として、提示されたコードに準じ、特定の1項目についてのみの取得となります。
(ラジオボタンが一つしかない)
ロジックの肝はItemとして取得したあとにMultipleChoiceItemとしてキャスト(変換)することですね。

/*省略*/
var form    = FormApp.getActiveForm(); //アクティブフォームを取得
var choices = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);//タイプを限定して配列へセット
var choice  = choices[0].asMultipleChoiceItem()
                        .getChoices()
                        .map(function(v){
                           return v.getValue();
                         });
//choice → ['13時〜','14時〜','15時〜']
/*省略*/


上記でchoiceとして配列にセットしていますので、適宜参照して処理を実行すれば良いかと思います。
以上、動作確認等はしておりませんので、参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 20:57

    アドバイスありがとうございます!

    まさに、やりたかったことが叶いました^^

    助かりました!ありがとうございます!

    キャンセル

  • 2018/04/17 22:14

    何よりです。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Google Apps Script

    718questions

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