タブの名前を「売上」から「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の使い方へつながります。
