GAS Google Sheet で アクティブなシートを取得に失敗する
Tags: gas
Published: 2022-03-30 16:59:01



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

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

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

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

```ts
  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 にあるスプレッドシートを開いてくれるわけではないようだ。

```ts
// The code below logs the URL for the active spreadsheet.
Logger.log(SpreadsheetApp.getActive().getUrl());
```

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

---

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

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

```ts
  const brandNewSheet = SpreadsheetApp.create("brandNewSheet")
  const activeSheetName = SpreadsheetApp.getActive().getName()
  Logger(activeSheetName)
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f94kz7yt84i48tuzzuet.png)

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

> 	
TypeError: Cannot read property 'getName' of null
myFunction	@ Code.gs:3

これでも読み取れない。

---

## openById で　open して getActiveSheet で取得に失敗

既に作成してあるファイルも、直前の行で作成したファイルもダメだったが、
open すれば流石にアクティブになるだろうと仮説を立てて実行。

Document の章でやった、DriveApp でファイル名からファイルID を取得するやり方で、先ほど作った brandNewSheet は

1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw

と言う ID なのを把握できた

```ts
  const sheetId = "1SQxrJ0MoC69ExqhiQZtWh7AbFEJ1vZDyYN-QZVdugTw"
  const sheet = SpreadsheetApp.openById(sheetId);
Logger.log(SpreadsheetApp.getActive().getName());

```

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

```ts
TypeError: Cannot read property 'getName' of null
myFunction	@ Code.gs:4
```

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

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqkg1p61rk0ja4slezwa.png)

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

===

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

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

```ts
  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

```ts
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[1]);
```

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

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

> TypeError: Cannot read property 'getSheets' of null

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

---

## まとめ

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

```ts
SpreadsheetApp.getActiveSpreadsheet()
```

これは 

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

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

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

---

## 今後

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

https://www.acrovision.jp/service/gas/?p=237
 
acrovision さんの記事によると
そのスクリプトファイルと紐づいているシートがアクティブという扱いになるらしい

なので紐付けを試みる。

---