Google Apps Script(GAS)を使って、スプレッドシート内のセルの色をカウントすることができます。質問者が直面した問題は、最初の1箇所目はうまくいったものの、2箇所目以降がうまく動作しないというものです。この記事では、複数箇所の色をカウントするための方法と解決策を詳しく解説します。
countcolor関数の基本
最初に書かれたコードは、1箇所目のセルを取得し、その色をカウントするためのものです。以下がそのコードです。
function countcolor() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
const color = sheet.getRange(1,18).getBackground();
const dcolor = sheet.getRange(3,20,20,1).getBackgrounds();
var count = 0;
for(var c = 0; c < dcolor[0].length; c++) {
for( r= 0; r < dcolor.length; r++) {
if(dcolor[r][c] == color) {
count++
}
}
}
return count ;
}
このコードは、指定された範囲内のセルの背景色と比較して一致するセルをカウントします。
2箇所目以降をうまく動かすための解決策
2箇所目を追加するためには、範囲やシートを変更するだけではなく、変数名や参照の方法を調整する必要があります。エラー「#NAME」が表示されるのは、関数内で名前が重複している、または無効な変数が使用されていることが原因です。
以下のコードでは、2箇所目以降の範囲を取得する方法と、複数のセル範囲に対して色をカウントする方法を紹介します。
function countcolorMultiple() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
const color1 = sheet.getRange(1,18).getBackground();
const color2 = sheet.getRange(3,22).getBackground();
const dcolor1 = sheet.getRange(3,20,20,1).getBackgrounds();
const dcolor2 = sheet.getRange(3,24,20,1).getBackgrounds();
var count1 = 0;
var count2 = 0;
for(var c = 0; c < dcolor1[0].length; c++) {
for( r= 0; r < dcolor1.length; r++) {
if(dcolor1[r][c] == color1) {
count1++
}
}
}
for(var c = 0; c < dcolor2[0].length; c++) {
for( r= 0; r < dcolor2.length; r++) {
if(dcolor2[r][c] == color2) {
count2++
}
}
}
return count1 + count2;
}
このコードは、2箇所目のセル範囲(例: 3行22列)を追加し、両方の色をカウントするように設定されています。countcolorMultiple関数は、2箇所目の色もカウントし、最終的に両方のカウント結果を返します。
最終チェックポイント
- 変数名の重複を避ける: 異なるセル範囲を参照する際、変数名(color、dcolorなど)が重複しないように注意しましょう。
- 範囲設定を正しく行う: それぞれの範囲(getRange)の指定を正確に行い、エラーが出ないようにしましょう。
- 関数名を変更する: 複数のバージョンの関数を使う場合、関数名(例えばcountcolor1、countcolor2など)を適切に変更して、衝突を避けます。
まとめ
最初の1箇所目のカウントはうまくいったものの、2箇所目以降で問題が発生する原因は、変数名の重複や範囲設定の誤りによるものが多いです。複数箇所をカウントする場合は、各範囲に対して個別に変数を設定し、それぞれの結果をまとめて返すことで解決できます。

コメント