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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

606閲覧

GASでグラフごとの色分けができないので改善策を知りたい

matsu_ph

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

1クリップ

投稿2023/08/21 08:07

実現したいこと

  • できあがるグラフの色をそれぞれわけたい

前提

コードは正しく動く

【データセット】
B1:K1に店舗名
A1:月
A2:A16に月データ
B2:K16に売上数値
B17:K17に総計

発生している問題・エラーメッセージ

コードそのものはただしく機能するが、グラフの色がすべて同じ色になる

該当のソースコード

GAS

1 2function chuou_per() { 3 area = "中央エリア" 4 5 createLineChartForSpecificNames(area) 6} 7 8 9 10function createLineChartForSpecificNames(area) { 11 12 let ss = SpreadsheetApp.getActiveSpreadsheet(); 13 let pivotSheet = ss.getSheetByName(area); 14 let lastColumn = pivotSheet.getLastColumn();//最終列を取得 15 let lastColumnName = getColumnLetter(lastColumn); 16 17 // ピボットテーブルシートのB1:K1から対象の名前リストを取得 18 let nameRange = pivotSheet.getRange("B1:" + lastColumnName + "1"); 19 let targetNames = nameRange.getValues()[0]; // 1行目のデータを取得 20 21 let chartTop = 23; // グラフの縦方向の配置位置 22 23 for (let i = 0; i < targetNames.length; i++) { 24 let targetName = targetNames[i]; 25 let dataColumn = i + 2; // B列から始まるため、インデックス+2が対応する列番号 26 let color = i 27 28 29 createLineChartFromPivotTable2(targetName, dataColumn, chartTop, area,color); 30 chartTop += 18; // グラフ間の縦方向のスペースを調整 31 32 } 33} 34 35 36function createLineChartFromPivotTable2(targetName, dataColumn, chartTop, area,color) { 37 // シートを取得 38 let ss = SpreadsheetApp.getActiveSpreadsheet(); 39 let pivotSheet = ss.getSheetByName(area); 40 41 // 使用するデータのセル範囲を取得 42 let lastRow = pivotSheet.getLastRow() - 1; // 最終行の一つ前の行番号を取得 43 let xRange = pivotSheet.getRange("A1:A" + lastRow); 44 let dataRowCount = xRange.getNumRows(); // データ行の数 45 let yRange = pivotSheet.getRange(1, dataColumn, dataRowCount, 1); // C列のデータ範囲 46 47 // データ範囲内の最大値を取得 48 let lastColumn = pivotSheet.getLastColumn();//最終列を取得 49 let lastColumnName = getColumnLetter(lastColumn); 50 let range = pivotSheet.getRange("B1:" + lastColumnName + lastRow);//dataすべて 51 let dataValues = range.getValues(); 52 let dataMaxValue = 0; 53 54 // データ範囲内の最大値を探す 55 for (let i = 1; i < dataValues.length; i++) { 56 for (let j = 0; j < lastColumn; j++) { 57 let cellValue = parseFloat(dataValues[i][j]); 58 if (!isNaN(cellValue)) { 59 dataMaxValue = Math.max(dataMaxValue, cellValue); 60 } 61 } 62 } 63 64 // 最大値を1.1倍して切り上げた値を設定 65 let roundedMaxValue = Math.ceil(dataMaxValue / 1000000) * 1000000; // 100万単位で切り上げたラウンド値 66 67 68 69 // タイトルのスタイルを設定 70 let titleTextStyle = { 71 fontSize: 14, // タイトルのフォントサイズ 72 bold: true, // ボールドフォントを使用 73 alignment: "center" // 中央揃え 74 }; 75 76 // 横軸の設定 77 let hAxisOptions = { 78 slantedText: true, 79 slantedTextAngle: 45, 80 textStyle: { 81 fontSize: 10 82 } 83 }; 84 85 // gridlines オプションの設定 86 let gridlinesOptions = { 87 count: dataRowCount 88 }; 89 90 //縦軸の設定 91 // vAxisの設定 92 let vAxisOptions = { 93 maxValue: roundedMaxValue, // ここに最大値を指定 94 minValue: 0, // ここに最小値を指定 95 format: "¥#,###", // 縦軸の表示フォーマットを指定 96 textStyle: { 97 fontSize: 10 98 } 99 }; 100 101 //データ系列の色を設定 102 let seriesOptions = { 103 0: { color: "#8AB3F8" }, // データ系列 0 の色を赤に設定 104 1: { color: '#EF7268' }, // データ系列 1 の色を青に設定 105 2: { color: '#FCCD43' }, // データ系列 2 の色を緑に設定 106 3: { color: '#34A853' }, 107 4: { color: '#FF6D01' }, 108 5: { color: '#46BDC6' }, 109 6: { color: '#7BAAF7' }, 110 7: { color: '#F07B72' }, 111 8: { color: '#FCD04F' }, 112 9: { color: '#71C287' }, 113 // 必要なだけデータ系列の色を設定してください 114 }; 115 116 let colors = Object.values(seriesOptions).map(option => option.color); 117 118 // チャートを作成 119 let chart = pivotSheet.newChart() 120 .setChartType(Charts.ChartType.LINE) // チャートの種類を設定 121 .addRange(xRange) // X軸のデータ範囲を追加 122 .addRange(yRange) // Y軸のデータ範囲を追加 123 .setNumHeaders(1) // ヘッダーとして扱う行・列の数 124 .setPosition(chartTop, 13, 0, 0) // グラフの配置位置を設定 125 .setOption("title", targetName) // タイトルを設定 126 .setOption("titleTextStyle", titleTextStyle) // タイトルのスタイルを設定 127 .setOption("hAxis", hAxisOptions) 128 .setOption("hAxis.gridlines", gridlinesOptions) 129 .setOption("colors", colors[color]) 130 .setOption("vAxis", vAxisOptions) // vAxisのオプションを設定 131 .build(); // チャートを作成 132 133 134 135 // シートにチャートを挿入 136 pivotSheet.insertChart(chart); 137} 138

試したこと

.setOption("colors", colors[color])

colors[color]を直接一つの色を指定すると、その色に正しくなる

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

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

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

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

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

codemaker

2023/08/21 10:46 編集

option の colors には色指定の文字列を「配列」で指定するのではないでしょうか。 let seriesOptions = { ... ... } として初期化しているのも、 本来は配列として指定するようになっていたのではないでしょうか。 入れ子のオブジェクトとして初期化して、 それを何故か単純な配列に変換した後に その単品要素を渡しているので...不思議な感じがしました。 オブジェクトとしての初期化の際に色指定文字列を[]で囲んでおくか .setOption("colors", [colors[color]]) としてみると指定の色になりますでしょうか。 これで指定の色になるようでしたら、 直接一つの色を指定すると正しくなったときの 指定の方法が気になります。
codemaker

2023/08/21 11:04 編集

// 必要なだけデータ系列の色を設定してください というコメントにあるとおり系列ごとの色指定を行うのであれば、 .setOption("colors", colors) として配列のまま渡すのもありではないでしょうか。 引数colorの意味がなくなりますが... その場合は、 オプション設定の前に for (let i = 0; i < color; i++) { colors.push(colors.shift()); } とするとか。
matsu_ph

2023/08/21 11:43

.setOption("colors", [colors[color]])こちらの方法で、できました!ありがとうございます。 直接、一つの色を指定すると正しくなったときは、純粋に.setOption("colors", "#8AB3F8" )としたら、できました。
codemaker

2023/08/21 12:30

私の環境ではできませんでした。 そちらでは、今でもできるのですね。 グラフの種類で違いがあるのかもしれません。
matsu_ph

2023/08/21 16:51

今回は折れ線グラフだったのですが…配列の部分、いまいち理解できてないのですが、勉強になりました。ありがとうございます! よろしければ、回答の部分にコメントいただければ、そちらで解決済みとさせていただきます。
codemaker

2023/08/21 20:54

> .setOption("colors", "#8AB3F8" )としたら、できました。 ということですから、 もともと正しく動いていたコードで自己解決したということだと思います。
matsu_ph

2023/08/22 04:26

ご丁寧にありがとうございます! .setOption("colors", [colors[color]])の部分が僕はわからなかったので、pgFruitさんに教えていただいたので、そちらで解決にしたいなと思った次第です。
matsu_ph

2023/11/20 14:07

.setOption("colors", colors[color])ではなく.setOption("colors", [colors[color]]) pgFruitさんありがとうございました!
guest

回答1

0

自己解決

.setOption("colors", colors[color])ではなく.setOption("colors", [colors[color]])

pgFruitさんありがとうございました!

投稿2023/11/27 12:08

matsu_ph

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問