【GAS】名前付き範囲を取得してGスプレッドシートからGoogleフォームのプルダウンに追加する

Googleフォーム

Googleフォーム関連

ご訪問ありがとうございます。

Googleシートマスターのひろしです。

前回

【GAS】Googleドキュメントにスプレッドシートのデータを表示文字列通りで差し込む
  • GASでスプレッドシートから日付取得時に変換する方法がわかります。
  • スプレッドシートの表示と同じ文字列を取得できるようになります。
  • GASの変更方法がわかります。
  • GASの中身には興味がないので、コピペでやる場合はこちら↓

    Googleフォームにスプレッドシートから項目を追加する方法(コピペでできる!)
  • 手軽にスプレッドシートからGoogleフォームに項目を追加できるようになります。
  • GASって何?状態であってもコピペでできます。
  • ボタンからGASを呼び出す方法がわかります。
  •  

    今回は、とっても価値の高い方法をお伝えします。


    これを知ることであなたは、

    • GASで名前付き範囲の取得ができます。
    • GASでGoogleフォームに名前付き範囲の項目を追加することができます。
    • GASでプルダウン、ラジオボタン、リストボックスの項目も追加できます。

    なので、サクッとマスターして

    と答えてあげてください。

    動画はこちら

    【GAS】 GoogleスプレッドシートからGoogleフォームに項目を追加する

     

    スクリプトはこちら

    const FORMID = '★*******'   //① GoogleフォームのID
    const ITEMNAME = '★項目名'        //② 項目のタイトル、名前付き範囲の名称
    
    
    
    /**
     * Googleフォームのプルダウンリスト、チェックボックス、リストボックスに項目を追加する
     */
    function AddGoogleFormItems() {
      const form = FormApp.openById(FORMID)
      const items = form.getItems()
    
    
      let section = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(ITEMNAME).getValues()
    
    
      console.log(section)
      section = section.filter(v => v[0])
      console.log(section)
    
    
      for (let i = 0; i < items.length; i++) {
        const item = items[i]
        const itemName = item.getTitle()
        const itemId = item.getId()
    
    
        //スプレッドシートのシェアハウスDBから内容を読み取って、Formの項目を更新する。
        if (itemName == ITEMNAME) {
          // items[i].asListItem().setChoiceValues(section)  //プルダウンメニュー
          // items[i].asCheckboxItem().setChoiceValues(section)  //チェックボックス
          items[i].asMultipleChoiceItem().setChoiceValues(section) //ラジオボタン
        }//if
      }//for
    }//end

     

    最後までご覧いただきありがとうございます。

    つぎはこちら

    Googleフォームにスプレッドシートから項目を追加する方法(コピペでできる!)
  • 手軽にスプレッドシートからGoogleフォームに項目を追加できるようになります。
  • GASって何?状態であってもコピペでできます。
  • ボタンからGASを呼び出す方法がわかります。
  • Googleフォーム関連

    コメント

    1. K より:

      いつも勉強になります。
      今回「名前付き範囲」ということでこちらにコメントさせていただきました。

      担当者が何時にどの社用車を使用しているかを管理しているシートがあるのですが、
      一日の最後にソートをしています。

      まず時間順で昇順にしたあと担当者で昇順にすることによって、担当者ごとに一日の動きが把握できるようにしています。
      ソートを二回行わなければいけないので、GASのボタンで一発で実行できないものかと考えました。

      問題点
      ①このシートはいっぱいになると行の追加が行われるので、ソートする範囲はその日によって変わってきます。

      ②このシートはGASによって、マスターシートを毎日0:00にコピーして一か月先までシートを用意する形になります。
      その際、日付をタイトルとしてタブに入力させてます。

      このことからソートする範囲を「名前付き範囲」として扱い、①の問題は回避できたのですが、②の問題で「名前付き範囲」がシートごとにバラバラになってしまい、そのシートごとに名前付き範囲の「名前」を取得しなければなりませんでした。

      この部分がうまく組めずエラーになってしまうので悩んでおります。

      検討いただければ幸いです。
      よろしくお願いいたします。

      • hiroshi より:

        質問が多岐に渡っていますね。
        シートをご提供いただきピンポイントで具体的な質問いただければ、回答できるかもしれません。

        • K より:

          返答ありがとうございます。

          シートのリンクを貼ったのですが見れなかったですかね?

          これはどうですか?
          https://docs.google.com/spreadsheets/d/1Ftp2vGYvN2gRat63SyhyGfM8w7O7xGRA1HyTUwpNmRo/edit#gid=0

          質問は、マスターシートにソートボタンをつけてコピーしていきたい
          というときに、コピーされたシートの名前付き範囲を取得するにはどうしたらいいのでしょうか?
          という感じです。

          固定された名前付き範囲なら(名前が決まっているので)ソートできたのですが、自動でコピーされていくシートに対して、それぞれの名前付き範囲をうまく取得できませんでした。

          よろしくお願いいたします。

          • hiroshi より:

            名前付き範囲ではなく、名前をつけずにソートしたい範囲をgetRange()すればいいのではないでしょうか?

            • K より:

              ありがとうございます。

              名前付き範囲でやろうと思った理由なのですが、
              ソートをしたい範囲がその日によって行が追加されたりして、毎日同じ範囲ではなかったためです。
              なのでget Range()だと難しいのかなと思ったのですが、、、

              ソートしたい範囲の下側も、別のデータを管理していて
              そちらも毎日行数が変わるんですよね。

              function sortSpreadsheet(){
              //スクリプトが紐づくスプレッドシートのアクティブなシートを読み込む
              const mySheet = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(‘メイン’);
              //列Bを基準に昇順でソートする
              mySheet.sort({column: 2, ascending: true});
              //列Eを基準に昇順でソートする
              mySheet.sort({column: 4, ascending: true});
              }

              上記のメインの部分に、名前付き範囲の範囲名を取得して
              入れればいいのかなと、いろいろ試したのですが
              範囲名が取得されなくて悩んでいたいた次第です。

        • hiroshi より:

          サンプル的なデータが入ったシートをご提供いただければ、回答できるかもしれません。

    2. hiroshi より:

      (例え名前付き範囲が取得できたとしてもその中身が可変にはならないと思います)
      getRangeするというのは、日々変更される範囲を指定してgetRange()するという意味です。
      sh.getLastRow()で最下行を取得するとかして。
      あるいは、sh.getDataRange().getValues()でシートのデータをまるごと取得する。

      いずれにせよ、こちらで試すことはできないので、ここまでですね。

    タイトルとURLをコピーしました