スプレッドシートで、ヒートマップを自動作成しようとしたところ、エラーが出てしまいました。どこをどのように直せばよいのでしょうか、人から頂いたコードで、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 < 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 < cells.length){ 58 tmpCells = [cells[k]]; 59 tmpGrads = [gradation[k]]; 60 var l = 1; 61 while (l + k < 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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/09 05:35