[GAS]名前付き範囲でスプレッドシートを操作しよう 後半戦

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは「名前付き範囲でスプレッドシートを操作しよう」について前半後半でご紹介しようと思います。今日は後半戦で「名前付き範囲をGASで操作しよう」をお届けします。

前回のおさらい

前回は、「名前付き範囲を設定しよう」ということで、名前付き範囲の設定、移動、削除を確認しました。「ユニークな名前を付けなければならない」こともポイントでした。

[GAS]名前付き範囲でスプレッドシートを操作しよう 前半戦
どうも。つじけ(tsujikenzo)です。このシリーズでは「名前付き範囲でスプレッドシートを操作しよう」について前半後半でご紹介しようと思います。今日は前半戦で「名前付き範囲を設定しよう」です。セルの取得2020年の12月に...

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

今回は「名前付き範囲をGASで操作」についてです。

GASで名前付き範囲を取得しよう

メソッドの確認

名前付き範囲をGASで操作するための.getRangeByName(name)というメソッドがあります。これはSpreadsheetクラスのメンバーです。

(※ getRange(シート名を含む名前付き範囲)メソッドでも可能です。210423追記)

Class Spreadsheet  |  Apps Script  |  Google for Developers

これは、前回お伝えしました「名前付き範囲はスプレッドシート全体でユニークな名前でなければならない。」ということに関わっていると思います。逆にいうと、「スプレッドシート全体でユニークな名前であるために、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で操作しよう」をお届けしました。社内などで共有シートを壊されて悩む方は多いと思います。シートを保護したり対策はさまざまですね。

この記事が、みなさんの課題解決に一役買えれば幸いです。

このシリーズの目次

  1. [GAS]名前付き範囲でスプレッドシートを操作しよう 前半戦
  2. [GAS]名前付き範囲でスプレッドシートを操作しよう 後半戦

タイトルとURLをコピーしました