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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

9585閲覧

"Exception: Argument cannot be null: a1Notation"の解決について

YousukeTanaka

総合スコア79

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/05/27 19:09

編集2021/05/29 08:51

やりたいこと

spreadsheetで、行のなかで色付きのセルの数をカウントしたいと考えています。

以下がそのイメージです。
イメージ説明

  1. 上記は、あるテストの回答で、数値が選択されています。
  2. 誤った回答には色がついています。
  3. エラーとなっている箇所に、関数が入る。その関数をコピーし以下の行に貼り付けると、自動的に各行の色がカウントされるようにしたい。

実行したこと

Gas

1function countCellsWithBackgroundColor(rangeSpecification) { 2 3 var sheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var ss = sheet.getSheetByName("Tally_1"); 5 var range = ss.getRange(rangeSpecification); 6 var x = 0; 7 var i = 0; 8 var j = 0; 9 var cell; 10 var color = "#f4cccc"; 11 for (i = 1; i <= range.getNumRows(); i++) { 12 for (j = 1; j <= range.getNumColumns(); j++) { 13 cell = range.getCell(i, j); 14 if(cell.getBackgroundColor() == color) 15 x++; 16 } 17 } 18 return x; 19}

つまづいたこと

イメージ説明

エラー Exception: Argument cannot be null: a1Notation countCellsWithBackgroundColor @ コード.gs:5

試みたこと

条件分岐で != null などを試したり、a1Notationを試したりしましたが、解決には至りませんでした。

5行目でエラーが出ていることはわかりますが、その後の解決の選択肢がなく、どう解決するべきか困っています。

参考

http://shanon-tech.blogspot.com/2015/12/2.html
https://webapps.stackexchange.com/questions/23881/calculating-shaded-cells

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://teratail.com/questions/338275#reply-465962

↑似たような色を数える自作関数の質問に回答してましたので、参考までに。

自作関数のセル範囲を利用する際、ダブルクォートで括らずに使う方法としては、上の質問者さんのコードのような、getActiveRangegetFormula で式を取り出して正規表現で参照範囲を取得する方法があります。

あとは範囲の列は固定されてるようなので一番簡単な方法として、シート関数 ROWあたりと組み合わせる方法もあります。

=countCellsWithBackgroundColor("E"&ROW()&":Q"&ROW())

上記で通常のシート関数と同じようにセル範囲の相対参照したいという要望は解決されると思います。

ただ、コードの書き方が一つ一つgetBackgroundColorを処理しているで動き重いんじゃないでしょうか?

  • まとめて対象範囲の背景色を getBackgroundColorsで取得してから対象の色をカウントする
  • 一つの式で範囲内の行毎の対象の色の数を返すような関数にする

といったことで、処理スピードが上げられるかと思いますので是非トライを。

投稿2021/06/04 08:00

sawa

総合スコア3002

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

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

YousukeTanaka

2021/06/06 08:36

ありがとうございます。試したところ、うまくいきました。同時に、COLUMN()と合わせたやり方も試してみました。勉強させていただきました。長い時間悶々としていた課題が解決して嬉しい限りです。感謝しています。
guest

0

rangeSpecificationnullなのですから、問題はこの関数の中ではなくて、この関数を呼び出している側に問題があります。

関数countCellsWithBackgroundColornullを渡してしまっている呼び出し元を見つけて解決してください。

投稿2021/05/27 22:52

itagagaki

総合スコア8402

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

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

YousukeTanaka

2021/05/28 05:30

承知しました。ご助言ありがとうございます。
YousukeTanaka

2021/05/28 18:33

確かに、確認したところ呼び出し側の関数に問題がありました。 =countCellsWithBackgroundColor("$E3:$Q3")と書けば、7という具体的な数値が出ました。ただし、これでは、文字列と認識されて、大量のデータを処理できません。""を除くためにNumber()を使ったり、.setValue()を使ったり、以下の記事を参考にして試しましたが、解決できませんでした。再度、ご助言をいただけますでしょうか? https://app.clickup.com/login
itagagaki

2021/05/29 04:40

私はコードを動かさないで回答しているので具体的なことはわかりませんのでいくつか質問させてください。 x が 7 となり、countCellsWithBackgroundColor から 7 が返された、ということですか? それは正しいのですよね? 文字列と認識されるというのは、countCellsWithBackgroundColor から return x で返された値が文字列として認識されてしまうということですか? 数値として返すと思いますが、return N(x) だとどうですか? あるいは、=N(countCellsWithBackgroundColor("$E3:$Q3")) ではどうですか? そして、大量のデータを処理できないというのは、どういう理由からですか?
YousukeTanaka

2021/05/29 06:26

>x が 7 となり、countCellsWithBackgroundColor から 7 が返された、ということですか? それは正しいのですよね? =>はい、7が返されております。関数内を""で囲むことで7と返されました。 >文字列と認識されるというのは、countCellsWithBackgroundColor から return x で返された値が文字列として認識されてしまうということですか? =>はい、そして、エラーとなり、「Exception: Range not found(行 4)が発生しました。」と出ます。 >数値として返すと思いますが、return N(x) だとどうですか?あるいは、=N(countCellsWithBackgroundColor("$E3:$Q3")) ではどうですか? =>return N(x)の場合は、エラーですが、後者は数値を返します。これは""で範囲を囲っているからだと考えています。N()を除くとエラーとなります。 >そして、大量のデータを処理できないというのは、どういう理由からですか? =>この関数をコピーして、全てのデータに適用できないという理由です。全てのセルでコピーした最初のセルの値になってしまいます。
itagagaki

2021/05/29 06:30

まず「関数内を""で囲む」の意味がわからないので具体的に教えてください。
YousukeTanaka

2021/05/29 06:48 編集

わざわざお時間を割いていただき感謝しております。承知しました。以下、回答になっておりますでしょうか? スプレッドシート(以下SS)の関数(スクリプトエディタ上ではない)を設定する際に、セル内に以下を設定しております。 =countCellsWithBackgroundColor() エラーとなる場合は、以下の場合です。もともと用意されているSS関数を使う際と同じように範囲を設定しております。 =countCellsWithBackgroundColor($E3:$Q3) エラーとならない場合は、以下のように、()内で範囲を""で囲んでいます。ただし、このようにすると、同じ列の全てのセルにこの関数を適用できなくなります。 =countCellsWithBackgroundColor("$E3:$Q3")
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問