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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Looker

Lookerは、データの可視化や分析を支援するサーバレスBIサービスです。LookMLを利用した統一的なモデル管理、gitによる定義の管理、充実したLooker APIなどが特徴です。

Q&A

1回答

1831閲覧

【LookerStudio】複数選択肢の集計について

8yazaki

総合スコア454

Looker

Lookerは、データの可視化や分析を支援するサーバレスBIサービスです。LookMLを利用した統一的なモデル管理、gitによる定義の管理、充実したLooker APIなどが特徴です。

0グッド

1クリップ

投稿2024/03/30 09:17

実現したいこと

Googleフォームのアンケートで複数選択肢のものを個別に集計したいと考えています。

例として、好きな季節と天気のフォームを作成し、次の出力結果になります。

【フォームサンプル】
イメージ説明

【スプレットシート出力内容】
イメージ説明

フォームの要約でグラフ化はされるのですが、次のようなグラフ化をLookerStudio内でも行いたいと考えています。
【LookerStudio内で表現したいグラフ】
イメージ説明

※このグラフを作成した上で、他項目との関連を調べたいと考えています。

発生している問題・分からないこと

LookerStudioでデータを読み込み、グラフ化しようとすると

イメージ説明

このように、複数選択されたもの全てが項目担ってしまいます。
(複数選択肢の組み合わせ分の項目が発生する可能性があります)

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

フィールド、グループ、パラメータの追加してLooker内の関数を使用すればできるのではないかと思い調べましたが、情報を見つけることはできませんでした。

【調べた内容】

補足

特になし

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

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

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

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

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

guest

回答1

0

このように、複数選択されたもの全てが項目担ってしまいます。
フィールド、グループ、パラメータの追加してLooker内の関数を使用すればできるのではないかと思い調べましたが、情報を見つけることはできませんでした。

LookerStudio には、質問に記載されているフォームの回答のような「変な形のデータ」をそのまま取り込む機能など、当然存在しません。
したがって、スクリプトで LookerStudio が解釈できる形のデータに変換してやる必要があります。

たとえば、「フォームの回答 1」というデータに下記の形でフォームの回答が集約されているとします。
イメージ説明


これを、質問にあるようなグラフに表示するには、スプレッドシート側のGASを使って、下記のような形に変換すればよいです。

イメージ説明

(なお、以降は、スプレッドシートに「グラフデータ」という名前のシートをあらかじめ作成しており、LookerStudioのレポートのデータソースにこのシートを設定済みであるという前提で進めます。
フォームの回答集約用に自動作成されたシート(「フォームの回答 1」に、LookerStudioに表示するグラフ用に変換したデータを上書きすることはできません。
仮にできたとしても、フォームの回答が追加されるとデータ形式がめちゃくちゃになります。なので別シートにする必要があります)

フォームの回答データ(グリッド形式の質問の回答)を変換するスクリプト

(フォームの回答が集約されているスプレッドシートからGASエディタを開き、下記を書いて保存して実行)
(フォームの追加回答がある度に実行する必要があります。トリガーによる自動実行については、対象外なので触れません)
(注意:このコードは、フォームの回答データが「フォームの回答 1」という名前のシートに集約されており、かつ、グラフ化したいデータがK列からQ列の間にあると仮定しています。
質問文ではこれらの情報が故意に省略されているため、勝手にこちらで設定しました。
ですので、下記をそのままコピペしても動かないと思います。
御自分の環境に合わせてスクリプトの3行目、6行目、9行目、29行目その他必要な部分を修正して下さい)

js

1function setSaygoChartData() { 2 // フォームの回答を集約しているシートの名前 3 const strFormResponsesSheetName = 'フォームの回答 1'; 4 5 // LookerStudio のグラフのデータソースにするシートの名前 6 const strChartDataSourceSheetName = 'グラフデータ'; 7 8 // 質問文 9 const strQuestionText = "③好きな季節と天気" 10 11 // 質問文から選択肢を取り出すための正規表現 12 const pattern = strQuestionText + ".+\\[(\\S+)\\]" 13 const regexp = new RegExp(pattern) 14 15 /* 16 * 質問項目と、それに対応する回答を格納するためのオブジェクト。 17 * キー:質問項目(例:「晴れ」「雨」「曇り」・・・) 18 * 値 :区切り文字で分割した回答の配列(例:['春', '夏', '秋', '冬', '春', '夏', '秋', '冬', '夏', 春・・・]」 19 */ 20 const objResponses = {} 21 22 const lastRow = SpreadsheetApp.getActive().getSheetByName(strFormResponsesSheetName).getLastRow(); 23 if (lastRow < 2) { 24 console.log(`エラー:シート${strFormResponsesSheetName}に回答データがありません。終了します。`); 25 return; 26 } 27 // フォームの回答データを取得し、objResponcesに格納する。 28 const responseRows = SpreadsheetApp.getActive().getSheetByName(strFormResponsesSheetName) 29 .getRange(1,11,lastRow, 7).getValues(); 30 //↑の getRangeの(1,11,lastRow, 7)というのはK列からQ列の間にデータがある場合を想定している。 31 // フォームの回答のデータに合わせて「11」と「7」という数字を変更すること。 32 33 for (let i = 0; i< responseRows.length; i ++) { // 行 34 for (let j = 0; j<responseRows[0].length; j++) { // 列 35 let key = ''; 36 if (responseRows[0][j] == null || responseRows[0][j] === '') continue; 37 let aryMatchedGroups = regexp.exec(responseRows[0][j]); 38 if (aryMatchedGroups == null) { 39 key = responseRows[0][j]; 40 } else { 41 key = aryMatchedGroups[1]; 42 }; 43 if (i === 0) { 44 // ヘッダ項目を取得し、objResponsesのキーに設定する。 45 objResponses[key] = []; 46 } else { 47 // ヘッダ項目に対応する回答データを取得。複数の回答は区切り文字で区切って格納する。 48 const cellValue = responseRows[i][j]; 49 if (cellValue == '') continue; 50 objResponses[key] = [...objResponses[key], ...cellValue.split(', ')]; 51 } 52 } 53 } 54 55 /* 56 この時点で、objResponses は 57 { 58 "晴れ": ["春", "夏", "秋", "冬", "春", "夏", "秋", "冬"], 59 "曇り": ["夏", "春", "夏", "秋", "冬"], 60 "雨": ["夏", "春", "夏", "秋", "冬"], 61 "にわか雨": ["春,", "春", "夏", "秋", "冬"], 62 "豪雨": ["春", "夏", "秋", "冬"], 63 "雪": ["冬", "春", "夏", "秋", "冬"], 64 "霧雨": ["冬", "春", "夏", "秋", "冬"] 65 } 66 のような形になる。 67 */ 68 69 // objResponse の内容をグラフ表示用のシートに反映する。 70 const shtChartData = SpreadsheetApp.getActive().getSheetByName(strChartDataSourceSheetName); 71 if (shtChartData == null) { 72 console.log(`エラー:${strChartDataSourceSheetName}という名前のシートが存在しません。終了します。`); 73 return; 74 } 75 shtChartData.getRange("A:B").clearContent(); 76 77 // スプレッドシートに書き込むため二次元配列に変換する。 78 let aryResponses = []; 79 for (let key of Object.keys(objResponses)) { 80 aryResponses = [...aryResponses, ...objResponses[key].map(response=>[key,response])]; 81 } 82 // ヘッダを追加 83 aryResponses.unshift(['好きな季節', '天気']); 84 85 // グラフデータ用シートにデータを書き込む。 86 shtChartData.getRange(1,1,aryResponses.length, aryResponses[0].length) 87 .setValues(aryResponses); 88}

なお、フォームの追加回答があってもスクリプトを実行しない限り、データは最新にはなりません。(トリガーによる自動実行についてはここでは質問対象外なので触れません)

「グラフの表示方法がわからない」と言われそうな気がしたので追記

上記スクリプトによりフォームの回答データを変換して「グラフデータ」シートに書き込み、LookerStudioでグラフデータを接続したときの初期状態は「好きな季節」と「Record Count」の2列だけになっています。ここで、右の「データ」ペインから「天気」を、レポートデータの「好きな季節」の右にドラッグ&ドロップして、ドリルダウンした状態にします。(下図)
イメージ説明

次に「グラフの追加」ボタンから「縦棒グラフ」を選択します。これで質問にあるのと同じようなグラフがLookerStudioに追加されます。
イメージ説明

 

イメージ説明

なお、春、夏、秋、冬の並びがバラバラに見えますが、好きな並べ方にすることはできないようです。(並べ替えでcase whenを使って季節にソート値を割り振っても変わりませんでした)
もし気になるなら、フォームの編集画面で回答の文字列を「01春」「02夏」「03秋」・・・「01晴れ」「02雨」「03曇り」・・・というようにソートできる文字列に変えてください。

フォームの回答データが追加された場合は、任意のタイミングでスプレッドシート側のスクリプトを実行してグラフデータを更新し、LookerStudioの編集画面で「Ctrl+Shift+E」を押すと、グラフが更新されます。
(編集画面ではなく、表示画面で更新する場合は、右上の3点マークから「データの更新」をクリックする)
(上記の回答は、LookerStudioを今日初めて知り数時間くらいしか触っていないレベルで公式やサイトで調べただけですのでまだ別の解があるかもしれません)

投稿2024/03/31 06:37

編集2024/03/31 10:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

8yazaki

2024/03/31 12:27

ご回答頂きありがとうございます! かなり詳細に記載して頂いて、とてもわかり易く、まだ試せていないのですが理想の内容だと思います! また明日以降担ってしまいますが試した上で、改めてコメントさせていただきます。 まずはお礼のみ先に失礼いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問