実現したいこと
- できあがるグラフの色をそれぞれわけたい
前提
コードは正しく動く
【データセット】
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]を直接一つの色を指定すると、その色に正しくなる
option の colors には色指定の文字列を「配列」で指定するのではないでしょうか。
let seriesOptions = {
...
...
}
として初期化しているのも、
本来は配列として指定するようになっていたのではないでしょうか。
入れ子のオブジェクトとして初期化して、
それを何故か単純な配列に変換した後に
その単品要素を渡しているので...不思議な感じがしました。
オブジェクトとしての初期化の際に色指定文字列を[]で囲んでおくか
.setOption("colors", [colors[color]])
としてみると指定の色になりますでしょうか。
これで指定の色になるようでしたら、
直接一つの色を指定すると正しくなったときの
指定の方法が気になります。
// 必要なだけデータ系列の色を設定してください
というコメントにあるとおり系列ごとの色指定を行うのであれば、
.setOption("colors", colors)
として配列のまま渡すのもありではないでしょうか。
引数colorの意味がなくなりますが...
その場合は、
オプション設定の前に
for (let i = 0; i < color; i++) {
colors.push(colors.shift());
}
とするとか。
.setOption("colors", [colors[color]])こちらの方法で、できました!ありがとうございます。
直接、一つの色を指定すると正しくなったときは、純粋に.setOption("colors", "#8AB3F8" )としたら、できました。
私の環境ではできませんでした。
そちらでは、今でもできるのですね。
グラフの種類で違いがあるのかもしれません。
今回は折れ線グラフだったのですが…配列の部分、いまいち理解できてないのですが、勉強になりました。ありがとうございます!
よろしければ、回答の部分にコメントいただければ、そちらで解決済みとさせていただきます。
> .setOption("colors", "#8AB3F8" )としたら、できました。
ということですから、
もともと正しく動いていたコードで自己解決したということだと思います。
ご丁寧にありがとうございます!
.setOption("colors", [colors[color]])の部分が僕はわからなかったので、pgFruitさんに教えていただいたので、そちらで解決にしたいなと思った次第です。
.setOption("colors", colors[color])ではなく.setOption("colors", [colors[color]])
pgFruitさんありがとうございました!

回答1件
あなたの回答
tips
プレビュー