やりたかったこと
アクティブなシートのひとつ前のシート(インデックス上でひとつ左側のシート)名を取得したかった。
というのも 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()
とすれば前のシートが取得できるようになりました。
関数内での関数の評価
冒頭で VLOOKUP 関数の引数に使いたいと書きましたが、このままでは使えません。関数が関数内で評価(解決)されないためです。そのために INDIRECT 関数を使います。
G3/VLOOKUP(A3, INDIRECT(getPreviousSheetName()&"!A:P"), 7, FALSE)
こんな感じでできあがりました! やったぜ!