Google Apps ScriptでgetSheetByNameは使わないほうが良い

getSheetByNameとは

getSheetByNameとはGoogleスプレッドシートのGoogle Apps Script (以下、GAS) で使用できるメソッドです。

このメソッドは、スプレッドシート内の特定のシートを名前で取得するために使用されます。

スクリプトが実行されるスプレッドシート内にあるシートを操作する際に、このメソッドを通じて特定のシートを取得できます。

例えば、以下のように「getSheetByName('シート1')」と指定すれば、取得したシートを操作できます。

function myFunction() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = spreadsheet.getSheetByName('シート1')

  sheet.getRange('A1').setValue('Hello')
}

getSheetByNameは使わないほうが良い

getSheetByNameを使用すると簡単にシートを取得して操作できますが、シート名が変わると操作不可になるというデメリットがあります。

例えば、Googleスプレッドシートのシート名が「シート1」から「data1」に変更された場合、同じGASコードを実行するとエラーになってしまいます。

Googleスプレッドシートでは、デフォルトのシート名は「シート1」で、シートを追加すると「シート2」、「シート3」というように名前が付けられます。

シート名が変更されることはよくあるため、getSheetByNameを使用すると意図せず問題を起こす可能性があります。

シートIDでシートを取得する

シート名ではなくシートIDを使用してシートを取得されるようにすれば、シート名が変更されてもエラーになりません。

シートIDはURLの「gid=0」の部分にある数値です。

最初のシートは必ず「gid=0」となり、追加されたシートは「gid=[ランダムの数値]」になります。

https://docs.google.com/spreadsheets/d/1PIamxHGBuj_rk7sOyF-mr4kAMxPLfveMQjF3b0ydaV4/edit#gid=0
https://docs.google.com/spreadsheets/d/1PIamxHGBuj_rk7sOyF-mr4kAMxPLfveMQjF3b0ydaV4/edit#gid=1858704750
https://docs.google.com/spreadsheets/d/1PIamxHGBuj_rk7sOyF-mr4kAMxPLfveMQjF3b0ydaV4/edit#gid=2003711257

教科別点数表サンプル

シートIDでシートを取得する関数を作成

GASには、getSheetByIdのようなシートIDからシートを取得するメソッドが存在しません。

const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()

// このようにシートIDを指定してシートを取得できない
const sheet = spreadsheet.getSheetById('1858704750')

そのため、シートIDからシートを取得できるように、シートのインデックスを取得する関数を作成する必要があります。(sheets[インデックス]でシートを取得します)

関数はgetSheets()でシートをすべて取得して、mapでgetSheetId()を使ってシートIDをすべて取得して配列にしたあとに、findIndex()で指定したシートIDのインデックスを返せば完成です。

const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
const sheetMathId = 1858704750

function getSheetIndexById(sheetId) {
  const sheetsIds = sheets.map((sheet) => sheet.getSheetId())
  const sheetIndex = sheetsIds.findIndex((id) => id === sheetId)
  if (sheetIndex >= 0) {
    return sheetIndex
  } else {
    throw new Error(`${sheetId}のシートIDは存在しません。`)
  }
}

console.log(getSheetIndexById(sheetMathId)) // 1

この関数を使用すれば、サンプルの「算数の点数表」からA2セルの値をシートIDで指定して取得できます。

const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
const sheetMathId = 1858704750

function getSheetIndexById(sheetId) {
  const sheetsIds = sheets.map((sheet) => sheet.getSheetId())
  const sheetIndex = sheetsIds.findIndex((id) => id === sheetId)
  if (sheetIndex >= 0) {
    return sheetIndex
  } else {
    throw new Error(`${sheetId}のシートIDは存在しません。`)
  }
}

function scoreCheck() {
  const score = sheets[getSheetIndexById(sheetMathId)].getRange('A2').getValue()
  console.log(score) // 75
}

https://docs.google.com/spreadsheets/d/1PIamxHGBuj_rk7sOyF-mr4kAMxPLfveMQjF3b0ydaV4/edit#gid=1858704750

シートIDでシートを取得しているため、「算数の点数表」のシート名を「数学の点数表」に変更しても、A2の値を取得できます。

このようにシートIDでシートを取得すると、少し手間はかかりますが、シート名を変更してもエラーにならずに動作するというメリットがあります。

getSheetByNameを使用すると、シート名が変更された場合にGASが動作しなくなるため、可能であればシートIDからシートを取得する方法をオススメします。