作成済みのシートを getActiveSheet で取得に失敗
GAS によって作成してあるシートはアクティブだろうと言う仮説を基に検証
https://tonari-it.com/gas-spreadsheet-object/
この 隣のIT などの多くの記事には
const ss = SpreadsheetApp.getActiveSpreadsheet();
console.log(ss.getName());
getActiveSpreadSheet でよしなに最新の?シートが取れるように書いてあるが
TypeError: Cannot read property 'getName' of null
実行すると中身がないとエラーになってしまう
getName ではなく getUrl で検証
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#create(String)
developers.google.com の公式ページを見てみたが、
記事の情報が古いわけではなく、メソッドは合っていた。
しかし、getActiveSpreadSheet では Drive にあるスプレッドシートを開いてくれるわけではないようだ。
// The code below logs the URL for the active spreadsheet.
Logger.log(SpreadsheetApp.getActive().getUrl());
getName がおかしいのかと思い、getUrl も試したけどだめだった
create 直後のシートを getActiveSheet で取得に失敗
前の行で作成した直後のシートならアクティブなシートとして取得できるだろうという仮説のもとに実行
const brandNewSheet = SpreadsheetApp.create("brandNewSheet")
const activeSheetName = SpreadsheetApp.getActive().getName()
Logger(activeSheetName)
ファイルは無事に作成されている。
作成された直後なのでアクティブだろ!と思ったが、
TypeError: Cannot read property 'getName' of null
myFunction @ Code.gs:3
これでも読み取れない。
openById で open して getActiveSheet で取得に失敗
既に作成してあるファイルも、直前の行で作成したファイルもダメだったが、
open すれば流石にアクティブになるだろうと仮説を立てて実行。
Document の章でやった、DriveApp でファイル名からファイルID を取得するやり方で、先ほど作った brandNewSheet は
1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw
と言う ID なのを把握できた
const sheetId = "1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw"
const sheet = SpreadsheetApp.openById(sheetId);
Logger.log(SpreadsheetApp.getActive().getName());
openById で開いて active かどうか確かめるが、
TypeError: Cannot read property 'getName' of null
myFunction @ Code.gs:4
これでもアクティブなのは取れなかった。
公式ドキュメントの他の getActive 系のメソッドを実行しても取得できない
似たような別のなら動くかと仮定して全て試した。しかし全てダメだった。
===
シートを先に setActiveSheet でアクティブにしてみる
getActiveSpreadsheet の対になる setActiveSheetをあらかじめ実行すれば
それで動くのでは?と仮定して動かしてみる
const sheetId = "1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw"
const sheet = SpreadsheetApp.openById(sheetId);
const activeSheet = SpreadsheetApp.setActiveSheet(sheet);
Exception: The parameters (SpreadsheetApp.Spreadsheet)
don't match the method signature
for SpreadsheetApp.setActiveSheet.
sheet を指定してアクティブにすることはできなかった
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#setactivesheetsheet
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[1]);
公式のサンプルでは先にアクティブなシートの配列を取ってから
それをさらにアクティブにする?謎の処理をしている
当然自分の環境で実行すると
TypeError: Cannot read property 'getSheets' of null
active なのが何もないエラーになってしまいますね
まとめ
Google Sheet の GAS での操作として、公式や個人ブログの記事によく出てくる
SpreadsheetApp.getActiveSpreadsheet()
これは
- GAS で事前に作成済みのシート
- GAS で前の行で作成直後のシート
- GAS で open 直後のシート
いずれもアクティブ扱いではないので、取得することができない
Google Document と同じように、ID か URL でしか操作ができなそうだ。
今後
次回はスクリプトファイルとシートの紐付けを試みる
https://www.acrovision.jp/service/gas/?p=237
acrovision さんの記事によると
そのスクリプトファイルと紐づいているシートがアクティブという扱いになるらしい
なので紐付けを試みる。
Top comments (0)