MENU

GASでシート名変更に強い参照を作る

当ページのリンクには広告(PR)が含まれていることがあります。
GASでシート名変更に強い参照を作る。タブ名が変わる、シートIDで参照、対象を確認の処理例。

タブの名前を「売上」から「11月売上」へ変えただけで処理が止まる場合、コードがシート名に依存している可能性があります。名前を利用者が変える運用なら、シートIDで取得する方法を検討できます。

スプレッドシートのファイルIDと、その中のシートIDは別です。シートIDはファイルの中でタブを識別する番号で、URLのgidで確認できます。タブの位置を示す番号とも異なるため、「左から2番目のシート」の代わりとして扱わないようにします。

目次

使うIDを2段階で確認する

ファイルを開くためのIDはスプレッドシートURLの/d/と/editの間にある文字列です。開いたファイルの中からタブを取得するために、シートIDを使います。シートIDだけでは別のファイルの同名タブを特定できません。

公式のSpreadsheetリファレンスにはgetSheetByIdがあり、対応するシートがなければnullを返します。シート側のgetSheetIdはファイル内での識別子を取得するメソッドです。

練習用ファイルで、対象のタブを選んだときのURLのgidを控えます。0も有効な番号になり得るので、if (!id)のような判定で0を不正と決めないようにします。使う番号を手入力する場合も、数字の意味を合わせて記録します。

名前を確認しながら取得するコード

以下はシートIDで取得した後、実際のシート名とA1の値を表示します。取得できない場合は、アクティブなシートなどへ置き換えずに止めます。

function readSheetById(book, sheetId) {
  if (!Number.isSafeInteger(sheetId) || sheetId < 0) {
    throw new Error('シートIDは0以上の整数で指定してください');
  }
  const sheet = book.getSheetById(sheetId);
  if (!sheet) throw new Error('対象のシートIDがありません: ' + sheetId);
  return {
    spreadsheetId: book.getId(),
    sheetId: sheet.getSheetId(),
    name: sheet.getName(),
    a1: sheet.getRange('A1').getDisplayValue()
  };
}

function previewSheetIdentity() {
  const SHEET_ID = 0; // 練習用タブのgidに置き換えます。
  const book = SpreadsheetApp.getActiveSpreadsheet();
  console.log(JSON.stringify(readSheetById(book, SHEET_ID)));
}

A1に「練習用」と書いたタブを指定し、ログに意図したファイルID、シートID、名前、A1の文字が出るか確認します。例の0は自分のファイルに合わせて置き換える値で、先頭タブのIDが必ず0だという意味ではありません。

名前変更と作り直しを区別する

同じタブの名前を変えた場合は、取得結果の名前が変わってもIDは同じ対象を指す想定です。練習用コピーで名前を変え、コード側の名前を書き換えずにA1の値を読めるかを確認します。

一方、タブを削除して同じ名前で作り直した場合は、以前のタブを取得したことにはなりません。IDが変わればこのコードは止まります。名前が一致しているからと自動で新しいタブへ切り替えると、列や計算式が異なる表を処理するおそれがあります。

ファイルを複製したり、別のファイルへ移したりした場合も、以前控えたIDを無条件に信用しないようにします。コピー先で対象を読み取り、ファイルとシートの組が合っているかを確認してください。

IDだけでは確認できないこと

同じタブでも、列の並べ替えや見出しの変更は起こります。シートIDが一致することで、表の構造まで同じだと判断しないことが大切です。書き込みを加える前に、必要な見出しと対象期間も調べます。

処理を定期実行する場合、アクティブなスプレッドシートがある前提は実行方法に左右されます。この例はシートから開いた練習用プロジェクト向けです。単独プロジェクトではファイルを明示的に開く部分を用意します。

ローカルでは代用ブックでIDが0の正常例、別の番号、未存在、負数、文字列を確認しました。Google上のタブ名変更や複製は未実行です。範囲を取得した後の読み方はセル・行・範囲の基本、設定をコードから分ける方法はPropertiesServiceの使い方へつながります。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次