DTPab

DTPにまつわるあれこれ

Google Sheetsで「前のシート名」を取得するカスタム関数

やりたかったこと

アクティブなシートのひとつ前のシート(インデックス上でひとつ左側のシート)名を取得したかった。
というのも VLOOKUP 関数を使うに当たり、シート名で特定しない、不特定なシートを指定したかったのです。

=G3/VLOOKUP(A3, 'PREVIOUSSHEET'!A:P, 7, FALSE), "")

こんな感じで 'PREVIOUSSHEET'!A:P の部分にそのシート名を代入したかった。
で、結局そういう関数がなさそうなので作った、という話です。

作ったスクリプト(カスタム関数)

function getPreviousSheetName() {
  const currentSS = SpreadsheetApp.getActiveSpreadsheet();
  const currentSSIndex = currentSS.getActiveSheet().getIndex() - 1;
  Logger.log(`${currentSS} ${currentSSIndex}`); //←ログの確認なので無視してもよい
  return currentSS.getSheets()[currentSSIndex - 1].getName();
}

注意しなければいけないのが、Sheet.getIndex()メソッドが1から始まるインデックスだということです。要するにcurrentSS.getActiveSheet().getIndex() - 1では現在アクティブなシートの0ベースインデックスを取得しています。
最後のreturn文でcurrentSS.getSheets()[currentSSIndex - 1]として、前のシートを取得しているわけです。

当然、インデックス上で最も左の最初のシートでこの関数を呼び出すとエラーになりますが、自分が使うだけなので気にしない…w
さて、これでセル内で=getPreviousSheetName()とすれば前のシートが取得できるようになりました。

f:id:uske_S:20201001231753p:plain
セル内に関数名ごと記述するだけでOK

関数内での関数の評価

冒頭で VLOOKUP 関数の引数に使いたいと書きましたが、このままでは使えません。関数が関数内で評価(解決)されないためです。そのために INDIRECT 関数を使います。

G3/VLOOKUP(A3, INDIRECT(getPreviousSheetName()&"!A:P"), 7, FALSE)

こんな感じでできあがりました! やったぜ!