Google Apps Scriptで枠線の情報を取得するには

はじめに

Google Apps Script(以下GAS)は、Googleスプレッドシートの機能を改善する便利なツールだ。
シートやセルの内容を取得して利用したり、結果をセルに書きこむなどの処理を追加することができる。

ほとんどのセルの情報はGASで簡単に取得できるのだが、実はセルの周囲の枠線の情報を取得する方法は、2023年12月現在において公式には提供されていない。
具体的には、Googleが提供しているリファレンスに、セルの周囲の枠線の情報を取得する方法は載っていない。

ちなみに、Googleが提供しているGASのリファレンスのURLは以下の通りだ。

https://developers.google.com/apps-script/reference/

なお、枠線を設定する方法はリファレンスに明記されている。
Range クラスの setBorder メソッドがそれに該当する。

枠線を設定する方法は提供されているのだが、枠線を取得する方法が公式には提供されていないという奇妙な状況になっているのだ。

ところで、リファレンスには載っていないのだが、実際にはメソッド getBorder および getBorders が存在し、これを利用すれば枠線の情報を取得できる。

なぜこれがリファレンスに載っていないかはいったん置いておくとして、当方で検証済みの getBorder の使用例を以下に示そう。

上記において pointer がセルの情報を保持しているRange型の変数で、そこから getBorder メソッドを使って枠線の情報を取得している。
上記のスクリプトによってセルの周囲の枠線は問題なく取得出来ている。

ちなみに、getBorder と getBorders の違いは、取得できるデータの個数にある。

前者が単一のセルの情報を取得するメソッドなのに対し、後者は複数のセルの情報を一度に取得するメソッドとなっている。
状況に応じて使い分けるのがよいだろう。

本記事では、この隠しメソッド getBorder および getBorders の使い方について、解析できている範囲で紹介していきたい。

使い方

Rangeの情報から枠線の情報を取得して来るメソッドが getBorder  および getBorders だ。

これらのうち、まずは単一のセルの情報を取得するメソッド getBorder について紹介したい。

getBorder の戻り値は、SpreadsheetApp 配下に定義されている Borders クラスの実体だと思われる。

このクラスもまたリファレンスには載っていないので推測でしかないのだが、セルの4辺の枠線情報を保持しているクラスのようだ。
GASのエディターのサジェストではこの名前が使われている。

なお、Range の範囲は特に1×1である必要はないが、getBorder が返却するのは範囲の先頭のセルの情報のみとなっている。

範囲の2番目以降のセルの情報を取得したい場合には、後述の getBorders を使用するか、Range の範囲を取得したいセルに合わせるかのいずれかの方法を取る必要がある。

さて、Borders クラスには4つのメソッドが定義されていて、それぞれがセルの4辺の枠線情報を取得可能になっている。

メソッド名はそれぞれ、getBottom、getLeft、getRight、getTopとなっている。

これらの4メソッドの戻り値の型は同じで、SpreadsheetApp 配下に定義されている Border クラスのようだ。
このクラスもまたリファレンスには掲載されていない。

以下は getTop メソッドの例だが、他の3メソッドも表示される内容はほぼ同じだ。

この Border クラスには2つのメソッドが定義されていて、枠線のスタイルや色が取得可能となっている。

メソッド名から推測できる通り、枠線のスタイルを取得するメソッドが getBorderStyle で、枠線の色を取得するメソッドが getColor となる。

getBorders メソッドについて

続いては、getBorders メソッドを紹介する。

getBorder はすでに紹介した通り、Range の範囲の先頭セルの枠線情報を取得するメソッドだ。
一方で、getBorders は Range の範囲の全セルの枠線情報を二次元配列形式で取得するメソッドとなる。

サジェストの内容は以下のようになっている。

関連するクラスとメソッドの一覧

上記の解析結果を表にまとめると以下のようになる。

上表のうち、BorderStyle と Color は隠しではなく、普通にリファレンスに載っている情報なので、不明な場合は確認してみるとよいだろう。

なお、色関係はやや複雑なので次項にて紹介したい。

枠線の色を取得する方法

色を取得するメソッドをリファレンスを参考にまとめると下表のようになる。

上表の通り、GASにおける色の概念には RgbColor と ThemeColor の2系統が存在する。
これらは排他であり、本来は色を取得する前に、まずその対象が保持している色が2系統のどちらに属するのかを調べなければならない。

ところが、枠線に関して言えば、保持している色が ThemeColor 側となるケースは存在しないようだ。

ただし、これは実験した結果であって、根拠となるドキュメントなどは見つけられてはいないことをお断りしておく。

前置きが長くなったが、枠線の色は RgbColor として取得することができる。
枠線が存在する場合は、Border から Color 経由で RgbColor を取得できる。

以下に、セルから上側の枠線の RgbColor を取得するコード例を示そう。
変数 cell が当該セルの Range を保持していると仮定すると、以下のコードで結果を変数 rgbColorTop に取り出せる。

let borders = cell.getBorder();
if (borders == null) <脱出処理>;
let borderTop = borders.getTop();
let colorTop = borderTop.getColor();
if (colorTop == null) <脱出処理>;
let colorTypeTop = colorTop.getColorType();
if (colorTypeTop != SpreadsheetApp.ColorType.RGB) <脱出処理>;
let rgbColorTop = colorTop.asRbgColor();

上記コードの簡単な補足をしておこう。

2行目はセルの上下左右に枠線が全く存在しない場合に Borders が null となるのでそのチェックをしている。

5行目は上側の枠線が存在しない場合に getColor の結果が null となるのでそのチェックをしている。
上側の枠線が存在しなくても Border 自身は必ずしも null にはならないので注意が必要だ。

6行目と7行目は ColorType を取得して RGB かどうかの確認をしている。
前述の通り、このチェックをしなくても恐らく ColorType は必ず RGB なのだが、念のためこのようなチェックを入れている。

ちなみに、<脱出処理>の部分には、文字通り処理を脱出する命令を記述することを想定している。
return 文などを状況に応じて記述すれば良いだろう。

なお、RgbColor には4つのメソッドがあって、色を文字列または整数で取得できる。
これらのメソッドを使って、色を取得するコード例も示しておこう。

let asString = rgbColor.asHexString();
let red = rgbColor.getRed();
let green = rgbColor
.getGreen();

let blue = rgbColor.getBlue();

上記コードの簡単な補足をしておこう。

変数 rgbColor に RgbColor が格納されているとしよう。

1行目は色を文字列で取り出している。
2行目から4行目は赤、緑、青に該当する色コードを整数で取り出している。

これ以上の詳細な説明は省かせていただくが、枠線の色を取得する方法の紹介は以上だ。

まとめ

GASでセルの枠線を取得する情報を紹介した。

今回紹介した内容はGASの公式ドキュメントに未記載の情報を、当方が独自に調査した結果となる。

利用に際しては、内容が陳腐化していたり、そもそも不正確な情報が記載されている可能性があることに十分注意していただきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です