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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

4940閲覧

スプレットシートで色を数えるコードを作ってはみたのですが…。

otaoma

総合スコア6

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/05/14 06:37

前提・実現したいこと

当方、プログラミング等に関して素人でサイト等を参考に見様見真似で、スプレットシートのscriptと使用して、色を数えるものを作りました。
作成した関数をセルに入力し使用していますが、不備が多く、作成したコードが正しいかも把握できない為、困っております。
ご教授の程、宜しくお願いいたします。

発生している問題・エラーメッセージ

以下のような問題点があります。
■COUNTを一つ一つ処理することになるため、処理が遅い&重い。。。(一次元配列というのでしょうか?)
■COUNTする該当範囲を塗りつぶし以外の方法で何らかの操作をしないと処理を実行しない。

エラーメッセージ
特になし

該当のソースコード

java script
ソースコード

  • 指定したセルの色を数える
  • @param {range} セル
  • @return {Number} 指定色
  • @customfunction

/
function countColor(countRange,colorRef) {
var activeRg = SpreadsheetApp.getActiveRange();
var activeSht = SpreadsheetApp.getActiveSheet();
var activeformula = activeRg.getFormula();
var countRangeAddress = activeformula.match(/((.
),/).pop().trim();
var backGrounds = activeSht.getRange(countRangeAddress).getBackgrounds();
var colorRefAddress = activeformula.match(/,(.*))/).pop().trim();
var BackGround = activeSht.getRange(colorRefAddress).getBackground();
var countCells = 0;
for (var i = 0; i < backGrounds.length; i++)
for (var k = 0; k < backGrounds[i].length; k++)
if ( backGrounds[i][k] == BackGround )
countCells = countCells + 1;
return countCells;
};

試したこと

別でCOUNTする該当範囲を操作するようなマクロを組み、トリガーを付けてやってはみたのですが、スマートとはかけ離れており、余計に重くなるだけの始末。。。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/14 12:04

> 作成した関数をセルに入力し使用していますが とのことですが、具体的にどういう関数を入力しているのでしょうか。 単にセルの背景色を取得するだけならば、 var countRangeAddress = activeformula.match(/\((.*)\,/).pop().trim(); や var colorRefAddress = activeformula.match(/\,(.*)\)/).pop().trim(); 等はいらないと思うのですが、これらの行はどういう動作を意図しているのでしょうか?
otaoma

2021/05/14 12:19

すいません、完全に素人に近いのでサイトに記載されてたコードを感覚で張り合わせただけなので作った私も理解できてません。 記載したコードにcountColorと名前をつけ、それをセルに入力して試してはみました。 下記のような方法です。 =countColor(範囲A2:AA2,数える色A1) 雰囲気で模索し、セルに入力すると一様は形にはなりましたが意味がわからないし不都合が発生するし重いしの始末です。。。
退会済みユーザー

退会済みユーザー

2021/05/14 12:31

要件は「セル範囲と色を指定して実行すると、指定したセル範囲内の、指定した色のセルの数が返される」ような関数、という理解でよろしいでしょうか。
sawa

2021/05/14 12:52 編集

var countRangeAddress = activeformula.match(/\((.*)\,/).pop().trim(); の記載は、自作のGAS関数の引数でセル範囲の記載を取得する時に使う書き方ですかね。 GASでセル範囲をそのまま引数として使いたい場合 "A2:AA2" としてあげる必要があるところを、一般的なシート関数と同じように A2:A22と書いても動くように、この自作GAS関数を入れたセルから式を取得して、そこから正規表現で A2:AA2の部分を引っこ抜いているのかと。
otaoma

2021/05/14 14:33

qnoirさん、そういうことです。 指定した色の数を指定した一列全てに返したい。 説明が下手くそで本当に申し訳ありません。
otaoma

2021/05/14 14:36

sawaさん、なるほどです。。 だからシート関数のように使えるのですね。 まだ理解が追いついてはいませんが(-_-;) 処理を早くするにはどうすればいいでしょうか? 良い方法があればご教示いただけると幸いです。
sawa

2021/05/15 00:32

実際に動かしてみましたが、書き方は置いといて動作としてはこんなもんかなって思います。GASの自作関数ってもったりした動きなんで。 極端に遅いってことであれば、色の種類がいっぱいあって、この関数を同じシート内で多用してるか、 もしくは対象となるセル数がとんでもなく多いとかでしょうか?
otaoma

2021/05/15 00:45 編集

同じシート内で多様しており、 対象となるセルはD:AYまでの46列の複数行にわたります。 こんなものなんですね(-_-;) ■COUNTする該当範囲を塗りつぶし以外の方法で何らかの操作をしないと処理を実行しない。 上記の内容への対応策みたいなものはあるでしょうか? 本当なら塗りつぶし直後に自作関数が動作してくれるのがベストなんですが。。。
退会済みユーザー

退会済みユーザー

2021/05/15 00:51 編集

現状(2021年5月時点)では、Google spreadシートに関して「セルに色を塗るというアクションを検知して、スクリプトで何かを行わせることはできない」ようです。 onEdit()も、セルに色を塗るというアクションだけでは開始しないようです。 onChange()という関数はそもそも動作しません。 (stackoverflowというサイトで複数のコメントがありました。) https://stackoverflow.com/questions/33337800/when-i-change-a-cells-background-color-how-can-i-get-all-cells-containing-the https://stackoverflow.com/questions/28637901/detect-background-color-change-in-google-spreadsheet-with-apps-script
otaoma

2021/05/15 03:57

そうですか。。。 sawaさんがチェックボックスの活用による打開策等も提示していただいたので何か良い方法を模索してみます。 ご丁寧にURLまで提示いただきありがとうございます!!
guest

回答1

0

ベストアンサー

GASの速度低下でよくあるのが、forループ内で、getRangeやgetValue、setValueを多用することで、今回の記述では先に getBackgrounds で配列として取得した後に処理してるので、forのループで遅いってことは無いと思います。

逆にこの関数を多用しているのは問題で、対象範囲の中身(セル内のテキスト等)が変更された時に同時に再計算がされるので重くなっているのかと、もし添付の画像のような縦並びで色を集計するならば 自作関数を修正してまとめて複数の色の数を配列として返す形にしてみてはいかがでしょうか?

あと、集計する側の色のところにチェックボックスなんかをつけておくと、チェックのON/OFFで関数が再計算されていい感じになるかと。残念ながら qnoir さんがコメントに書かれているように、色を変えて 再計算されるようなものは出来ないです。(ダミーの引数に TODAY() なんかを入れて、定期的に再計算させる逃げ方はありますが)

■修正案 (コードは、あまり元の記述をいかせてません。。)

イメージ説明

function countColor2(countRange,colorRef) { var activeRg = SpreadsheetApp.getActiveRange(); var activeSht = SpreadsheetApp.getActiveSheet(); var activeformula = activeRg.getFormula(); var rangeAddress = activeformula.match(/((.*)\,(.*))/).map(ad => ad.trim()).slice(1); var backGrounds = activeSht.getRangeList(rangeAddress).getRanges().map(r => r.getBackgrounds().flat(1)); var colorCount = backGrounds[1].map(sc => backGrounds[0].filter(tc => tc==sc).length); return colorCount; }

投稿2021/05/15 01:04

sawa

総合スコア3002

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

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

otaoma

2021/05/15 02:41

ご提案ありがとうございます!! 元のコードは気にしないでください。 コピーして少しいじった程度なので^^; >自作関数を修正してまとめて複数の色の数を配列として返す形にしてみてはいかがでしょうか? 縦並びで色の数を返すのですが、一つ一つの色別に指定して配列として返すコードがド素人の為、恥ずかしながら思い浮かびません…。 ss getRange(返す場所指定?) copy? 色の指定をどうしよう? こんな感じの知識レベルです。。。 申し訳ありません。
sawa

2021/05/15 02:50

回答に入れたコードをコピペで使ってください。速度があまり改善されないようであれば申し訳ないです。 使い方はスクショのような感じで、colorRef の箇所に集計したい色のセル範囲を入れてあげればよいです。
otaoma

2021/05/15 03:58

承知しました。一先ず提示いただいたコードを使い、それを元に内容の理解と打開策を模索してみます。 色々とご丁寧にご説明いただき、感謝しております!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問