GASでトークン等を保存しておけるプロパティサービスについてまとめてみた

## はじめに
外部APIなどを利用するとき、アクセストークンやシークレットキー、他にもユーザのIDなど、個人の情報が必要になる時があると思います。これらの情報を他人が見えるような場所に書いておくのは、セキュリティの観点から危険です。

Google Apps Script（以後、GAS)では、そういった情報をプロパティサービスという機能を使って、他人には見えないような形で保存しておくことが可能です！今回は、そのプロパティサービスについてまとめていきます！

今回まとめている情報は、GASの公式ガイド、ドキュメントをもとに記載しています。

https://developers.google.com/apps-script/guides/properties

https://developers.google.com/apps-script/reference/properties/properties-service

https://developers.google.com/apps-script/reference/properties

## GASでトークン等を保存しておけるプロパティサービスについてまとめてみた
### そもそもプロパティサービスとは
プロパティサービスとは、特定の情報を`key`と`value`のペアで保存しておける機能のことです。アクセストークンなど、コードに直接記載しないほうがよい情報を保存をしておくのに便利です。

プロパティは３種類あります。

- スクリプトプロパティ
    - 特定のスクリプトからのみアクセス可能なプロパティで、すべてのユーザがアクセス可能
    - アプリケーション全体に関わる情報を保存するのに適している
- ユーザープロパティ
    - 特定のスクリプトからのみアクセス可能なプロパティで、カレントユーザーのみアクセス可能
    - ユーザ特異の情報を保存するのに適している
- ドキュメントプロパティ
    - 開いているドキュメント、スプレッドシート、フォームからアクセス可能なプロパティで、すべてのユーザがアクセス可能
    - 埋め込みのチャートのURLなど、ドキュメント特異の情報を保存するのに適している

### IDEで管理する
スクリプトプロパティのみにはなりますが、GASのIDE上で追加・編集・削除が可能です。

まずはGASのIDEにアクセスして、左サイドバーの一番下にある歯車マークをクリックします。
![スクリーンショット 2022-10-23 10.54.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/4bdd9f3c-6cc3-3642-f504-f34c635707a9.png)

`プロジェクトの設定`という画面になるので、その画面の一番下にある`スクリプト プロパティ`というセクションで設定が可能です。
![スクリーンショット 2022-10-23 10.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/24521dea-0424-6bd3-6c1d-ded713f5c59d.png)

プロパティを追加した後にプロパティを編集・追加したい場合は`スクリプト プロパティを編集`をクリックして、編集・追加を行います。
![スクリーンショット 2022-10-23 10.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/375ee7d8-1211-18d0-011d-c8945b7d3980.png)

追加したスクリプトプロパティを利用する場合は、以下のようなコードで読み取ることが可能です。
```js
const scriptProperty = PropertiesService.getScriptProperties().getProperty('KEY');
Logger.log(scriptProperty); // VALUE
```

### コードで管理する
プロパティはコード上で追加、編集、読み取り、削除が可能です。

プロパティを追加する場合は、`Properties.setProperty(KEY, VALUE)`というメソッドを使うことで実現可能です。もうすでに存在するプロパティを編集する場合も、こちらのメソッドを使用して実現することができます。

プロパティの種類によって若干コードが異なるので、種類ごとに記載します。

```js:プロパティを追加する
// スクリプトプロパティの場合
PropertiesService.getScriptProperties().setProperty('SCRIPT_PROPERTY_KEY', 'script_property_value');

// ユーザープロパティの場合
PropertiesService.getUserProperties().setProperty('USER_PROPERTY_KEY', 'user_property_value');

// ドキュメントプロパティの場合
PropertiesService.getDocumentProperties().setProperty('DOCUMENT_PROPERTY_KEY', 'document_property_value');
```

プロパティを読み取る場合は、`Properties.getProperty(KEY)`というメソッドを使うことで実現可能です。

```js:プロパティを読み取る
// スクリプトプロパティの場合
const scriptProperty = PropertiesService.getScriptProperties().getProperty('SCRIPT_PROPERTY_KEY');
Logger.log(scriptProperty); // => script_property_value

// ユーザープロパティの場合
const userProperty = PropertiesService.getUserProperties().getProperty('USER_PROPERTY_KEY');
Logger.log(userProperty); // => user_property_value

// ドキュメントプロパティの場合
const documentProperty = PropertiesService.getDocumentProperties().getProperty('DOCUMENT_PROPERTY_KEY');
Logger.log(documentProperty); // => document_property_value
```

プロパティを削除する場合は、`Properties.deleteProperty(KEY)`というメソッドを使うことで実現可能です。また各種類のプロパティをすべて削除する場合は、`Properties.deleteAllProperties()`で実現することが可能です。

```js:プロパティを削除する
// スクリプトプロパティの場合
PropertiesService.getScriptProperties().deleteProperty('SCRIPT_PROPERTY_KEY'); // 特定のプロパティを削除する
PropertiesService.getScriptProperties().deleteAllProperties(); // すべてのプロパティを削除する

// ユーザープロパティの場合
PropertiesService.getUserProperties().deleteProperty('USER_PROPERTY_KEY'); // 特定のプロパティを削除する
PropertiesService.getUserProperties().deleteAllProperties(); // すべてのプロパティを削除する

// ドキュメントプロパティの場合
PropertiesService.getDocumentProperties().deleteProperty('DOCUMENT_PROPERTY_KEY'); // 特定のプロパティを削除する
PropertiesService.getDocumentProperties().deleteAllProperties(); // すべてのプロパティを削除する
```

## さいごに
今回はGASのプロパティサービスについてまとめました！トークンなどがだいぶ管理しやすくなるので、ぜひ使ってみてください！