DEV Community

kaede
kaede

Posted on • Edited on

4 2

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 さんの記事によると
そのスクリプトファイルと紐づいているシートがアクティブという扱いになるらしい

なので紐付けを試みる。


Top comments (0)

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️