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

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

ただいまの
回答率

90.61%

  • Google Apps Script

    787questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 604

9nom

score 30

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

エラーメッセージ

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

コード

// 指定範囲内における値の順位を元に、ヒートマップカラーの背景色を適用する
//
// 色をRGB各チャネル 0 ~ 255 の配列で表現する
// 例 : 黒→[0,0,0], 白→[255,255,255], 青→[0,0,255]

var RGB_ON_MAX_VALUE = [240, 179, 34]; // 最大値の色
var RGB_ON_MIN_VALUE = [255, 255, 255]; // 最小値の色
var HEATMAP_RANGE = 'B2:H25'; // 適用範囲

// 公差1の等差数列を作成する関数
function generateNumArray(begin, length) {
  var array = [];
  for(i = 0; i < length; i++) {
    array[i] = begin + i;
  }
  return array;
}

// グラデーションの配列を作成する関数
function createGradation(maxRGB, minRGB, steps) {
  var gradation = generateNumArray(0, steps).map(function(i) {
    var r = maxRGB[0] * i / steps + minRGB[0] * (1 - i / steps);
    var g = maxRGB[1] * i / steps + minRGB[1] * (1 - i / steps);
    var b = maxRGB[2] * i / steps + minRGB[2] * (1 - i / steps);
    return [r, g, b];
  });
  return gradation;
}

function paintBackground(range, RGB){
  return range.setBackgroundRGB(RGB[0], RGB[1], RGB[2]);
}

function compareValue(preCell, nextCell){
  return preCell.getValue() - nextCell.getValue();
}

function calcAveColor(RGBs, colorChannel){
  return RGBs.map(function(RGB){
    return RGB[colorChannel];
  }).reduce(function(p, a){
    return p + a;
  }) / RGBs.length;
}

// 平均の色を計算する関数
function calcAveRGB(RGBs){
  var aveR = calcAveColor(RGBs, 0);
  var aveG = calcAveColor(RGBs, 1);
  var aveB = calcAveColor(RGBs, 2);
  return [aveR, aveG, aveB];
}

// 同順位の値のセルを同じ色で塗りつぶすためにグラデーションを調整する関数
function adjustToCellsValue(gradation, cells){
  var k = 0;
  while (k < cells.length){
    tmpCells = [cells[k]];
    tmpGrads = [gradation[k]];
    var l = 1;
    while (l + k < cells.length) {
      if (cells[k].getValue() === cells[k + l].getValue()) {
        tmpCells.push(cells[k + l]);
        tmpGrads.push(gradation[k + l]);
        l++;
      } else {
        break;
      }
    }
    var aveRGB = calcAveRGB(tmpGrads);
    for (m = k; m < k + l; m++){
      gradation[m] = aveRGB;
    }
    k = k + l;
  }
  return gradation;
}

// この関数を ツールバー > リソース > 現在のプロジェクトのトリガー に イベント: スプレッドシート、値の変更 で登録しておく
function applyHeatMap() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];  
  var range = sheet.getRange(HEATMAP_RANGE);
  var numColumns = range.getNumColumns();
  var numRows = range.getNumRows();
  var steps = numColumns * numRows;

  // 指定範囲のセルを、その値の小さい順にソートした配列
  var cells = generateNumArray(1, numColumns).map(function(column) {
    return generateNumArray(1, numRows).map(function(row) {
      return range.getCell(row, column);
    });
  }).reduce(function(pre,current) {
    return pre.concat(current);
  }, []).sort(compareValue);

  var gradation = createGradation(RGB_ON_MAX_VALUE, RGB_ON_MIN_VALUE, steps);
  var adjustedGradation = adjustToCellsValue(gradation, cells);

  // セルの背景を調整済みグラデーションで塗りつぶす
  cells.forEach(function(cell, i, cells){
    paintBackground(cell, ajustedGradation[i]);
  });
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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


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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/09 14:35

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    787questions

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