DEV Community

kaede
kaede

Posted on • Updated on

GAS Google Sheet で アクティブなシートを取得に失敗する

作成済みのシートを getActiveSheet で取得に失敗

GAS によって作成してあるシートはアクティブだろうと言う仮説を基に検証

https://tonari-it.com/gas-spreadsheet-object/

この 隣のIT などの多くの記事には

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  console.log(ss.getName());
Enter fullscreen mode Exit fullscreen mode

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());
Enter fullscreen mode Exit fullscreen mode

getName がおかしいのかと思い、getUrl も試したけどだめだった


create 直後のシートを getActiveSheet で取得に失敗

前の行で作成した直後のシートならアクティブなシートとして取得できるだろうという仮説のもとに実行

  const brandNewSheet = SpreadsheetApp.create("brandNewSheet")
  const activeSheetName = SpreadsheetApp.getActive().getName()
  Logger(activeSheetName)
Enter fullscreen mode Exit fullscreen mode

Image description

ファイルは無事に作成されている。
作成された直後なのでアクティブだろ!と思ったが、

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());

Enter fullscreen mode Exit fullscreen mode

openById で開いて active かどうか確かめるが、

TypeError: Cannot read property 'getName' of null
myFunction  @ Code.gs:4
Enter fullscreen mode Exit fullscreen mode

これでもアクティブなのは取れなかった。

公式ドキュメントの他の getActive 系のメソッドを実行しても取得できない

Image description

似たような別のなら動くかと仮定して全て試した。しかし全てダメだった。

===

シートを先に setActiveSheet でアクティブにしてみる

getActiveSpreadsheet の対になる setActiveSheetをあらかじめ実行すれば
それで動くのでは?と仮定して動かしてみる

  const sheetId = "1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw"
  const sheet = SpreadsheetApp.openById(sheetId);
  const activeSheet = SpreadsheetApp.setActiveSheet(sheet);
Enter fullscreen mode Exit fullscreen mode
Exception: The parameters (SpreadsheetApp.Spreadsheet) 
don't match the method signature 
for SpreadsheetApp.setActiveSheet.
Enter fullscreen mode Exit fullscreen mode

sheet を指定してアクティブにすることはできなかった

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#setactivesheetsheet

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[1]);
Enter fullscreen mode Exit fullscreen mode

公式のサンプルでは先にアクティブなシートの配列を取ってから
それをさらにアクティブにする?謎の処理をしている

当然自分の環境で実行すると

TypeError: Cannot read property 'getSheets' of null

active なのが何もないエラーになってしまいますね


まとめ

Google Sheet の GAS での操作として、公式や個人ブログの記事によく出てくる

SpreadsheetApp.getActiveSpreadsheet()
Enter fullscreen mode Exit fullscreen mode

これは

  • GAS で事前に作成済みのシート
  • GAS で前の行で作成直後のシート
  • GAS で open 直後のシート

いずれもアクティブ扱いではないので、取得することができない

Google Document と同じように、ID か URL でしか操作ができなそうだ。


今後

次回はスクリプトファイルとシートの紐付けを試みる

https://www.acrovision.jp/service/gas/?p=237

acrovision さんの記事によると
そのスクリプトファイルと紐づいているシートがアクティブという扱いになるらしい

なので紐付けを試みる。


Oldest comments (0)