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

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

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

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

Q&A

解決済

1回答

850閲覧

GASでヒートマップを作成したい

9nom

総合スコア42

Google Apps Script

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

0グッド

2クリップ

投稿2017/09/08 15:10

スプレッドシートで、ヒートマップを自動作成しようとしたところ、エラーが出てしまいました。どこをどのように直せばよいのでしょうか、人から頂いたコードで、GASがわからないため困っています。

エラーメッセージ

for-loop コントロールの後に ) がありません。(行 13、ファイル「コード」)

コード

GAS

1// 指定範囲内における値の順位を元に、ヒートマップカラーの背景色を適用する 2// 3// 色をRGB各チャネル 0 ~ 255 の配列で表現する 4// 例 : 黒→[0,0,0], 白→[255,255,255], 青→[0,0,255] 5 6var RGB_ON_MAX_VALUE = [240, 179, 34]; // 最大値の色 7var RGB_ON_MIN_VALUE = [255, 255, 255]; // 最小値の色 8var HEATMAP_RANGE = 'B2:H25'; // 適用範囲 9 10// 公差1の等差数列を作成する関数 11function generateNumArray(begin, length) { 12 var array = []; 13 for(i = 0; i &lt; length; i++) { 14 array[i] = begin + i; 15 } 16 return array; 17} 18 19// グラデーションの配列を作成する関数 20function createGradation(maxRGB, minRGB, steps) { 21 var gradation = generateNumArray(0, steps).map(function(i) { 22 var r = maxRGB[0] * i / steps + minRGB[0] * (1 - i / steps); 23 var g = maxRGB[1] * i / steps + minRGB[1] * (1 - i / steps); 24 var b = maxRGB[2] * i / steps + minRGB[2] * (1 - i / steps); 25 return [r, g, b]; 26 }); 27 return gradation; 28} 29 30function paintBackground(range, RGB){ 31 return range.setBackgroundRGB(RGB[0], RGB[1], RGB[2]); 32} 33 34function compareValue(preCell, nextCell){ 35 return preCell.getValue() - nextCell.getValue(); 36} 37 38function calcAveColor(RGBs, colorChannel){ 39 return RGBs.map(function(RGB){ 40 return RGB[colorChannel]; 41 }).reduce(function(p, a){ 42 return p + a; 43 }) / RGBs.length; 44} 45 46// 平均の色を計算する関数 47function calcAveRGB(RGBs){ 48 var aveR = calcAveColor(RGBs, 0); 49 var aveG = calcAveColor(RGBs, 1); 50 var aveB = calcAveColor(RGBs, 2); 51 return [aveR, aveG, aveB]; 52} 53 54// 同順位の値のセルを同じ色で塗りつぶすためにグラデーションを調整する関数 55function adjustToCellsValue(gradation, cells){ 56 var k = 0; 57 while (k &lt; cells.length){ 58 tmpCells = [cells[k]]; 59 tmpGrads = [gradation[k]]; 60 var l = 1; 61 while (l + k &lt; cells.length) { 62 if (cells[k].getValue() === cells[k + l].getValue()) { 63 tmpCells.push(cells[k + l]); 64 tmpGrads.push(gradation[k + l]); 65 l++; 66 } else { 67 break; 68 } 69 } 70 var aveRGB = calcAveRGB(tmpGrads); 71 for (m = k; m < k + l; m++){ 72 gradation[m] = aveRGB; 73 } 74 k = k + l; 75 } 76 return gradation; 77} 78 79// この関数を ツールバー > リソース > 現在のプロジェクトのトリガー に イベント: スプレッドシート、値の変更 で登録しておく 80function applyHeatMap() { 81 var ss = SpreadsheetApp.getActiveSpreadsheet(); 82 var sheet = ss.getSheets()[0]; 83 var range = sheet.getRange(HEATMAP_RANGE); 84 var numColumns = range.getNumColumns(); 85 var numRows = range.getNumRows(); 86 var steps = numColumns * numRows; 87 88 // 指定範囲のセルを、その値の小さい順にソートした配列 89 var cells = generateNumArray(1, numColumns).map(function(column) { 90 return generateNumArray(1, numRows).map(function(row) { 91 return range.getCell(row, column); 92 }); 93 }).reduce(function(pre,current) { 94 return pre.concat(current); 95 }, []).sort(compareValue); 96 97 var gradation = createGradation(RGB_ON_MAX_VALUE, RGB_ON_MIN_VALUE, steps); 98 var adjustedGradation = adjustToCellsValue(gradation, cells); 99 100 // セルの背景を調整済みグラデーションで塗りつぶす 101 cells.forEach(function(cell, i, cells){ 102 paintBackground(cell, ajustedGradation[i]); 103 }); 104}

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

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

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

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

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

guest

回答1

0

ベストアンサー

詳しくは読んでいませんが、13 行目の

js

1 for(i = 0; i &lt; length; i++) {

js

1 for(i = 0; i < length; i++) {

であるべきだと思います。他の &lt;< でないとおかしいですね。

投稿2017/09/08 15:20

unau

総合スコア2468

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

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

9nom

2017/09/09 05:35

素早い回答ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問