Google Apps Script の Manifests について （appsscript.json） 参考サイトとメモ

## Manifestsとは
https://qiita.com/tanaike/items/b3538e7550555ebb51f5

Manifestsは、`appsscript.json`というファイルで各種設定を編集することで機能を追加できる機能。

それまではブラウザから各スイッチをクリックしてようやく機能追加に至っていたがjsonの編集で機能を追加できるようになったことで便利になった。

__初期設定__　

```
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}
```

設定の一例：__拡張サービスのDrive APIをオンにする設定__

```
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Drive",
      "serviceId": "drive",
      "version": "v2"
    }]
  },
  "exceptionLogging": "STACKDRIVER"
}

```
### プロパティの一例

|  __プロパティ__ |  __内容__  |
| ---- | ---- |
|  timeZone	  |  タイムゾーンの設定  |
| oauthScopes[] |	スコープの設定 |
|  dependencies	| 拡張サービス（dependencies.enabledAdvancedServices[]） <br>ライブラリの設定（dependencies.enabledAdvancedServices[]） |
|exceptionLogging | ログの記録場所（初期値: STACKDRIVER） |
|  webapp |	ウェブアプリケーションの設定（デプロイされていることが前提）  |
| executionApi | 実行可能APIの設定（デプロイされていることが前提） |
|  urlFetchWhitelist[] | URL Fetch ServiceでアクセスできるURLの設定  |
|  gmail | Gmailアドオンとしてデプロイされているリソースの設定  |
|runtimeVersion | JavaScriptエンジン"V8"の設定 |


## Drive API について

https://qiita.com/shikumiya_hata/items/16984b3e639438100db6

https://note.com/visionarybase/n/n2862376d1916

https://officeforest.org/wp/2019/12/11/google-apps-script%E3%81%A7%E5%85%B1%E6%9C%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

### Drive API とは

__共有ドライブ__ の操作を実装するために有効化する __API__

### 共有ドライブとは

https://support.google.com/a/answer/7212025?hl=ja

>Google ドライブの共有ドライブでは、チームで使うファイルの保存、検索、および、ファイルへのアクセスができます。
共有ドライブ内のファイルは、個人ではなくチームが所有します。
メンバーがいなくなってもファイルはそのまま残るため、どこにいてもどのデバイスからでも、チームで引き続き情報を共有して仕事を進めることができます。

### 共有ドライブの主な操作

+ 共有ドライブの作成
+ フォルダの作成
+ ファイルの作成
+ フォルダの移動
+ ファイルの移動
+ 共有ドライブの削除

__Googleドライブ__ は __「DriveApp」__ を、___共有ドライブ___ は ___「Drive」___ を、それぞれ使用する。

また、Googleドライブ(DriveApp)と共有ドライブ(Drive)とで扱う __オブジェクトは型が異なる__ 。
共有ドライブはTeamDrive型、GoogleドライブではFolder型。
実際にはファイルまで含めると __DriveApp（Googleドライブ）__ で操作する方が多くなるので、 __Folder型__ に変換して操作する方が便利。

## 共有ドライブのコードについて

https://note.com/visionarybase/n/n2862376d1916

https://officeforest.org/wp/2019/12/11/google-apps-script%E3%81%A7%E5%85%B1%E6%9C%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

参考サイト参照

#### 手順

+ Drive API を有効にする
+ 権限一覧を整備する
+ TeamDrive型からDrive型に変換
+ 共有ドライブを取得
+ 共有ドライブを新規作成
+ 共有ドライブにフォルダを作成
+ 共有ドライブを削除
+ ライブラリ化せず、functionをそのまま使う形で実装するコード例
+ 非公式APIリファレンス

## oauthScopes[]について

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　「スコープ」

https://wa3.i-3-i.info/word1222.html

https://www.pre-practice.net/2019/03/google-api.html

### スコープとは

影響範囲のこと。

### OAuth

https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

https://zenn.dev/mryhryki/articles/2020-12-28-oauth2-flow

### OAuth2.0スコープ とは

「スコープ」は書かれたコードから自動判定される模様。

スクリプトの実行に必要なアクセス権。
スクリプトを実行するユーザのデータに対して、どんな操作を行うか判断する。
例えば「データを読むだけ」とか「アプリで作ったデータの読み書きだけ」とか。

### 確認と設定

__確認__
「ファイル > スクリプトのプロパティ > スコープ」 の中で確認できる。

__設定__
「表示 > マニフェスト ファイルを表示」　　で`appsscript.json`が開くのでそこに追加する。

```
"oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive"
  ]
```

https://developers.google.com/identity/protocols/oauth2/scopes

|　スコープ　　|  |
| ---- | ---- |
|https://www.googleapis.com/auth/spreadsheets | See, edit, create, and delete your spreadsheets in Google Drive|
| https://www.googleapis.com/auth/drive | See, edit, create, and delete all of your Google Drive files |

## STACKDRIVER

https://qiita.com/micah/items/fbb1b06d26b6a9e96ee0

クラウドベースのアプリケーション向けに統合化された、監視機能やロギング機能を提供するモニタリングツール。
GCPだけでなく、AWS上で動くリソースの監視や情報収集、診断が行うことができる。

### Stackdriver Logging

クラウドや、オープンソースアプリケーションからのログを表示、フィルタリング、検索する機能を備えている。
ログを BigQuery、Google Cloud Storage、Pub/Sub にエクスポートすることもできるので、高速にログ解析ができる。

他にも下記の機能がある。詳細は参考サイト参照のこと。

+ Stackdriver Monitoring
+ Stackdriver Error Reporting
+ Stackdriver Debugger
+ Stackdriver Trace
+ Stackdriver Profiler（BETA）
 
## "runtimeVersion": "V8" とは

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典　「ランタイム」

https://wa3.i-3-i.info/word13464.html

https://tonari-it.com/gas-v8-runtime/

https://qiita.com/tanabee/items/113bfe2e3497b4462b68

https://work-professor.org/?p=737

### ランタイムとは
プログラムを動かすときに必要な部品を指す用語

### V8ランタイムとは

GASのアップデートにより、「Rhinoランタイム」というJavaScriptエンジンに加え、 __「V8ランタイム」__ と呼ばれるJavaScriptエンジン（ECMAScript第6版（ES6））がサポートされた。
一般で最もよく使用されているJavaScriptエンジンで、「Rhinoランタイム」では使えなかったJavaScript構文のいくつかが、新たに使えるようになったり、開発環境のいくつかも改善した。


#### V8ランタイムの設定方法

+ スクリプトエディタのメニューから設定する
+ マニフェストファイル（`appsscript.json`）を編集して設定する方法がある。
※2022年現在はappsscript.jsonの設定なしでES6が使用可能とのこと。（デフォルトでONになる模様）
下記サイト参照

https://officeforest.org/wp/2020/02/06/google-apps-script%E3%81%AEv8-runtime%E5%AF%BE%E5%BF%9C%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/


__`appsscript.json`を編集する場合__

__runtimeVersion__ フィールドに __"V8"__ を指定することで、切り替えが可能。

```
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```