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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

3回答

32496閲覧

Googleフォームの選択肢をスプレッドシートから取得したい

Michey

総合スコア19

Google Apps Script

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

2グッド

6クリップ

投稿2016/03/29 05:47

Javascript、ExcelVBAはある程度開発経験がありますが
Google Apps ScriptやGoogleドキュメントの類は初めて触っています。

タイトルの通りですが、カテゴリマスタのデータを入れたスプレッドシートから
フォームの選択肢を取得したいのですが、可能でしょうか。
(カテゴリが600以上あることと、追加時のことを考慮し手入力を避けたい)

GASとGoogleフォームでいくら調べてもなかなか引っかからないので
もしかしたら出来ないのかもしれないと諦めかけているところです。

Cobatto, AkiraMasuda👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

すいません、teratailに馴れなていのでコメントで返してしまいました。下記に対する返答です。

①既存の質問事項のIDを取得→選択肢をクリア・再設定という内容にして起動をトリガーに実行する様にしたい

GAS

1function getCategory() { 2 var mspid = "xxxxxxxxxxxxxxxxxx"; //スプレッドシートのID 3 var ss = SpreadsheetApp.openById(mspid); 4 var sheets = ss.getSheets(); 5 var mst = sheets[0]; 6 7 var dt = mst.getSheetValues(1, 1, row数, column数); 8 9 var frmid = "xxxxxxxxxxxxxxxxxx"; //フォームのID 10 var frm = FormApp.openById(frmid); 11 var list = frm.getItems( FormApp.ItemType.LIST ); 12 var qui = list[0].asListItem(); // リストが複数あるなら「[0]」を適宜変更 13 14 var choices = [] 15 for (var i = 0; i < dt.length; i++){ 16 choices.push(qui.createChoice(dt[i][0])); 17 } 18 qui.setChoices(choices); 19}

以下コメント再掲:

取得は、
var qui = frm.addListItem().setTitle('カテゴリ選択');

var list = frm.getItems( FormApp.ItemType.LIST );
var qui = list[0].asListItem(); // リストが複数あるなら「[0]」を適宜変更
これでいけませんかね。

setChoices が上書きで起こる場合は qui.setChoices(choices); のままで問題ないし、追記のみの場合は qui.getChoices() でリストを取得して入っていないものを追加、とか。
仕様に項目の削除がなかったから、多分上書きだと思うのですが。

また、トリガーはフォーム起動でなく、スプレッドシートの更新(リスト項目の追加)かタイマーでまわしたほうが良い気がします。

以上です。

投稿2016/03/30 05:21

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Michey

2016/03/30 07:05

ありがとうございました! いただいた情報を元に何とか形にします!
guest

0

すみません、半分ほど自己解決しました。
https://developers.google.com/apps-script/reference/forms/choice

Google

1function getCategory() { 2 var mspid = "xxxxxxxxxxxxxxxxxx"; //スプレッドシートのID 3 var ss = SpreadsheetApp.openById(mspid); 4 var sheets = ss.getSheets(); 5 var mst = sheets[0]; 6 7 var dt = mst.getSheetValues(1, 1, row数, column数); 8 9 var frmid = "xxxxxxxxxxxxxxxxxx"; //フォームのID 10 var frm = FormApp.openById(frmid); 11 var qui = frm.addListItem() 12 .setTitle('カテゴリ選択'); 13 14 var choices = [] 15 for (var i = 0; i < dt.length; i++){ 16 choices.push(qui.createChoice(dt[i][0])); 17 } 18 qui.setChoices(choices); 19}

ただ、この内容だと新しい質問事項の追加なので
①既存の質問事項のIDを取得→選択肢をクリア・再設定という内容にして起動をトリガーに実行する様にしたい
②選択肢の表示と実際に送信される値を別にしたい
という課題が残っています。

②に関してはこの質問の本筋から離れていくと思うので別途解決法を探しますが、①については引き続きこちらで追わせてください。

投稿2016/03/30 02:26

編集2016/03/30 02:35
Michey

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/03/30 03:03

取得は、 var qui = frm.addListItem().setTitle('カテゴリ選択'); ↓ var list = frm.getItems( FormApp.ItemType.LIST ); var qui = list[0].asListItem(); // リストが複数あるなら「[0]」を適宜変更 これでいけませんかね。 setChoices が上書きで起こる場合は qui.setChoices(choices); のままで問題ないし、追記のみの場合は qui.getChoices() でリストを取得して入っていないものを追加、とか。 仕様に項目の削除がなかったから、多分上書きだと思うのですが。 また、トリガーはフォーム起動でなく、スプレッドシートの更新(リスト項目の追加)かタイマーでまわしたほうが良い気がします。
Michey

2016/03/30 04:37

ありがとうございます、出来ました! 質問事項の特定に躍起になってましたが配列で取得してしまえばいいのですね。 >また、トリガーはフォーム起動でなく、スプレッドシートの更新(リスト項目の追加)かタイマーでまわしたほうが良い気がします。 なるほど、その方が呼び出し頻度が少なくてスマートですね。 その様に実装しようと思います! BAしたいのでお手数ですが一度回答入力いただけますでしょうか?
guest

0

GoogleフォームではなくGASでフォームを作ればできると思います。HTMLを書いてURLを発行する感じです。HTMLテンプレート部分にもGASが使用できるので、スプレッドシートから項目呼び出しなども可能です。

【【短いコードで色々出来る】Google Apps Scriptでスプレッドシートと連携した無料Ajaxフォームの作り方※サンプル付き【自動返信メールもあるよ】 - Qiita】
http://qiita.com/snowsunny/items/56a85c63598dcfb1b06e

投稿2016/03/29 09:29

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Michey

2016/03/30 01:51

回答ありがとうございます。 実はそのページにはたどり着いていたのですが、自分自身がAjaxをはじめWeb関連にそこまで精通していないことと全体的な社員IT力が低いことを考えて、自分が良く理解できていないことに手を出すのを躊躇していました・・・ 先ほど半自己解決しましたが、やはり全てを思った通りに作成するのは難しそうなのでリンク先の方法も試してみようと思います。
kei344

2016/03/30 02:04

GASはjsの知識があればさほど難しくないのですが、出力部分(HTMLテンプレート)が独自仕様なので案外てこずります。がんばってください! また、自己解決された方法を回答に書き、ひとまず「解決済」になされてはいかがでしょう。
Michey

2016/03/30 02:32

>出力部分(HTMLテンプレート)が独自仕様 お…恐ろしいですね…… (半)自己解決、記載しました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問