どうも。つじけ(tsujikenzo)です。このシリーズでは「名前付き範囲でスプレッドシートを操作しよう」について前半後半でご紹介しようと思います。今日は後半戦で「名前付き範囲をGASで操作しよう」をお届けします。
前回のおさらい
前回は、「名前付き範囲を設定しよう」ということで、名前付き範囲の設定、移動、削除を確認しました。「ユニークな名前を付けなければならない」こともポイントでした。

このような名前付き範囲を設定して終わりましたね。

今回は「名前付き範囲をGASで操作」についてです。
GASで名前付き範囲を取得しよう
メソッドの確認
名前付き範囲をGASで操作するための.getRangeByName(name)というメソッドがあります。これはSpreadsheetクラスのメンバーです。
(※ getRange(シート名を含む名前付き範囲)メソッドでも可能です。210423追記)

これは、前回お伝えしました「名前付き範囲はスプレッドシート全体でユニークな名前でなければならない。」ということに関わっていると思います。逆にいうと、「スプレッドシート全体でユニークな名前であるために、Spreadsheetクラスのメンバーとして操作できる」ともいえますね。
使い方はこうです。
スプレッドシートオブジェクト.getRangeByName(名前付き範囲)
戻り値の確認
戻り値はRangeオブジェクトです。実際にコードを書いて実行みましょう。コンテナバインドスクリプトに書きます。(説明は割愛します。)
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const range = ss.getRangeByName('送信日'); console.log(range.getA1Notation()); //E3 }
.getA1Notation()メソッドは、Rangeオブジェクトをアドレス形式で返してくれるメソッドです。
コード内にコメントアウトで書きましたが、みなさんの実行ログでも「E3」などのセルアドレスが返ることが確認できましたでしょうか。
日付を設定する
Rangeオブジェクトが取得できているということは、さまざまな値を設定することができます。今回は「作成日」のセルなので、日付(2021年3月1日としました。)を設定します。
const d = new Date(2020, 2, 1); const documentCreationDate = range.setValue(d);
スプレッドシートも確認してみましょう。

複数セル範囲の名前を操作する
応用編です。別のシート[納品書]を用意してみました。中には表形式のセル範囲が挿入されています。

このセル範囲に[納品内訳]という名前付き範囲を設定します。

複数セル範囲を取得する
GASで取得してみましょう。今度は.getValues()メソッドで値を取得してみます。
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const range = ss.getRangeByName('納品内訳'); console.log(range.getValues()); }
2次元配列で値を取得できているようです。
前回のおさらいになりますが、名前付き範囲は、行や列が移動しても影響を受けません。列[生産者]と行[ごぼう、たまねぎ]を増やしてみます。

さきほどと全く同じコードを実行してみましょう。

無事、加えた行・列も2次元配列で取得できているようです。
列タイトルから値を取得する
このことを応用して、「列タイトルから値を取得する」ことができます。個々のメソッドの紹介は割愛させていただきますが、割とスッキリ書けます。
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const range = ss.getRangeByName('納品内訳'); const records = range.getValues(); const index = records.shift().indexOf('商品名'); //0 const items = records.map(record => record[index]); console.log(items); }
このような結果になります。

スプレッドシートの運用ルールとして、「列の追加や移動はご法度」だったかもしれませんが、これでユーザーが自由に操作することができますね。
Excelにも「テーブル機能」がありますが、また別の機会にご紹介したいと思います。
今回はここまです。
まとめ
さて、以上で「名前付き範囲をGASで操作しよう」をお届けしました。社内などで共有シートを壊されて悩む方は多いと思います。シートを保護したり対策はさまざまですね。
この記事が、みなさんの課題解決に一役買えれば幸いです。