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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

1025閲覧

スプレッドシートで背景色を参照した処理を行うGASを構築したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/16 07:22

編集2021/10/16 07:25

特定のセルと同じ背景色を探し出し同じ入力内容にしたい

スプレッドシートでカレンダーを作成し予定を入力しているのですが、同じ内容は同じ色のセルにしてまとめています。
ある時データを吹っ飛ばしてしまい、内容が無いままセルの色だけ残ってしまいました。

幸い手帳など他のデータから復元は可能なのですが、過去5年分くらいあるため手作業でやるのはちょっと面倒そう。
そこで、GASで処理できないかと一念発起しコードを書いてみましたが、中々思い通りに動いてくれません。

イメージとしては下記のようなカレンダー表そのままです。

A1 ~年~月 1 月 C1 D1 E1 F1 G1 2 火 C2 D2 E2 F2 G2 3 水 C3 D3 E3 F3 G3 4 木 C4 D4 E4 F4 G4 5 金 C5 D5 E5 F5 G5

例えば<A1>の背景色を"赤"にして"出張"と入力した場合、C1:G5の範囲内で背景が赤いセル全てに出張と入力される、そういったコードを書きたいのです。

現状では1行目しか判定されず、どうしたら範囲内全てを判定されるようになりますでしょうか?
宜しくお願いいたします。

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

TypeError: Cannot read property '0' of undefined identifyColor @ 色.gs:17

該当のソースコード

function identifyColor(){ var sheet = SpreadsheetApp.getActiveSheet(); var targetColor = sheet.getRange("任意のセル").getBackground(); var colorsListRange = sheet.getRange("任意の範囲"); var colorArray = colorsListRange.getBackgrounds(); var contentArray = colorsListRange.getValues(); for(var i = 0; i < 100; i++){ var cellColor = colorArray[i][0]; if(cellColor == targetColor){ contentArray[i][0] = "=任意のセル"; }else{ contentArray[i][0] = ""; } } }

試したこと

17行目にエラーが出てしまいます。
i<7にすると動作しますが、今度は1行7セルだけしか判定してくれません。

参考資料

https://qiita.com/310ma3/items/6dcb70ee345b9c65d313

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

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

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

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

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

guest

回答2

0

ベストアンサー

myFunction の A1 とか C1:G5 とかを意図する範囲にして、実行してください。

スクリプトエディタを開いた時点のアクティブなシートを対象に作用します。
あと、A1 と同じ色だったら、そこに何かが書かれていても強制的に "出張" に上書きされますのでご注意ください。
(やっていると思いますが、被害を拡大させないように、現状のものは一旦コピーしてバックアップを取りましょう)

javascript

1const myFunction = () => { 2 q364697("A1","C1:G5"); 3} 4const q364697 = (sourceA1, targetA1, sheetName) => { 5 sourceA1 = sourceA1 || "A1"; 6 targetA1 = targetA1 || "C1:G5"; 7 const workingSheet = sheetName ? SpreadsheetApp.getActive().getSheetByName(sheetName) : SpreadsheetApp.getActiveSheet(); 8 const sourceRange = workingSheet.getRange(sourceA1); 9 const keyColour = sourceRange.getBackground(); 10 const designatedValue = sourceRange.getValue(); 11 const targetRange = workingSheet.getRange(targetA1); 12 const targetColours = targetRange.getBackgrounds(); 13 const targetValues = targetRange.getValues(); 14 targetRange.setValues(targetValues.map((r,i)=> r.map((c,j) => targetColours[i][j] === keyColour ?designatedValue:c))); 15}

TypeError: Cannot read property '0' of undefined

i を 100 とかにしてますが、おそらく 100 ないんじゃないですかね。
"任意の範囲"みたいにぼやかすと、助言も↑のようにふわっとしたものになります。

投稿2021/10/16 08:53

papinianus

総合スコア12705

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

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

papinianus

2021/10/16 08:55

勝手にコードをかきかえたのは、バグだけ直したところで getValues して得たデータに "=A1" のような関数を入れても何も起きないですし、そもそも setFormula とか別の考慮が必要なんで、最初からやりたいことに近づけました。
退会済みユーザー

退会済みユーザー

2021/10/17 06:21

papinianus 様 書き換えて頂いたコードを実行しましたところ、希望通りの処理が叶いました。 いやはや、自身の知識の拙さには恥じ入るばかりです。 ご教授頂きましたコードを紐解きながら、もっと勉強したいと思います。 この度は誠にありがとうございました。
guest

0

17行目にエラーが出てしまいます。
i<7にすると動作しますが、今度は1行7セルだけしか判定してくれません。

C1:G5の範囲で実行するとcolorArrayの要素数は4ですが、100回ループしているのでインデックスがArrayの要素数を超えています。

デバッグすると、わかりやすいと思います。

イメージ説明

// 配列の要素数に達したらループ終了 for(var i = 0; i < colorArray.length; i++){

期待通りの動作になるかわかりませんが、これでエラーは解消されるはずです。

投稿2021/10/16 08:52

jhashimoto

総合スコア838

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

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

papinianus

2021/10/16 08:59

その修正を入れましたが > 17行目にエラーが出てしまいます。 > i<7にすると動作しますが、今度は1行7セルだけしか判定してくれません。 回答冒頭で引用されている↑の 2 行目の課題が解消しておらず、たかだか 5 セルしか判定してくれませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問