【GoogleAppsScript】Googleアカウント情報の取得

# はじめに
Google Apps Scriptを使用してGoogleアカウントの情報を取得する方法について調査しました。Google Apps Script APIを使用して取得する情報と、APIを使用せずに取得できる情報があります。
本記事では、実行ユーザーの以下の情報を取得する方法と、関連するエラーの解消方法について記載します。

- メールアドレス
- 名前（Google Apps Script APIを使用）


## Google Apps Scriptとは？
Google Apps Scriptは、Googleが提供するローコードプラットフォームです。Gmailアカウントがあれば無料で利用でき、開発環境のセットアップが不要なため、すぐに始められるのが特徴です。
Google Apps Scriptを利用することで、以下のようなGoogleが提供する各種サービス（１部）の自動化やその他サービスと連携が可能です。
- Gmail
- Googleドライブ
- Googleスプレッドシート
- Googleカレンダー
- Googleドキュメント
- Googleスライド
- Googleフォーム

https://workspace.google.com/intl/ja/products/apps-script/

# 前提
Googleアカウントに以下の項目が登録されていること
- メールアドレス
- 名前
- その他の取得したい項目

## Google App Scriptの使用方法
情報を取得する前に、Google Apps Scriptの開き方と新規ファイルの作成方法について説明します。
### Google App Scriptの開き方
Google Apps Scriptは、多くの場合Googleアプリのファイルから開かれます。
以下はスプレッドシートからGoogle Apps Scriptを開く方法です。

1.Google スプレッドシートを開きます。

2.ツールバーから「拡張機能」→「Google Apps Script」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/decfd207-114b-2bfd-8d2e-9fc90e081dd5.png)

自動でコード.gsファイルと以下のコードが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/ce8e99d6-2c64-74cd-305b-ab55ba98392d.png)

:::note info
Googleドライブの任意の場所で右クリック→「その他」→ 「Google App Script」を選択することで、直接開くこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/81725694-da7d-6f38-c57d-7fd2d53fba18.png)
:::

### 新規ファイルの作成方法
1.Google Apps Scriptエディタで、ファイルの横の「+」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/a024703f-68c7-0160-5fc6-2c94e6305565.png)

2.「スクリプト」または「HTML」を選択します。
※スクリプトを選択すると、「コード.gs」の初期状態と同じファイルが作成されます。
HTML
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/870dc7cc-d707-54c4-cc24-5f2b6411f9ba.png)



## メールアドレスの取得
Googleアカウントの連絡先情報に記載されているメールアドレスを取得します。
メールアドレスはAPIを使用せずに取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/ac4b44b3-d984-c483-48f8-d6bd455a4081.png)


```account.js
function getMailAddress() {
  const address = Session.getActiveUser().getEmail();
  Logger.log("メールアドレスは" + address + "です");
}
```
:::note info
以下のメソッドは現在サポートが終了しています。
[getUserLoginId()](https://developers.google.com/apps-script/reference/base/user?hl=ja "Class User")
:::

### 実行手順
①関数を選択し、【実行】を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/1a367820-78e2-adf6-f3e0-efe3cc75f442.png)

:::note warn
初めて実行した場合、確認ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/509e31f6-2296-6926-04df-9e3cc7ce4714.png)
:::

②【権限を確認】を押下し、アカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/d485fa61-cf68-d880-77c1-695ee18a7e3c.png)


### 結果
メールアドレスが取得され、以下のようにログに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/accae966-f653-f8fa-61a0-54f4c546d43a.png)

## 名前の取得（Google Apps Script APIを使用）
Googleアカウントの【名前と発音】に登録されている情報を取得します。
名前の取得には、サービスの追加（Google Apps Script APIの使用）が必要です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/72c8b735-b590-afdd-3e94-d5a85c79ea50.png)

①サービスの【+】を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/87db923d-1f79-d1fd-4de9-58523629853e.png)

②追加するサービス（People APIドキュメント）を選択し、【追加】を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/74096d36-1430-e42e-e7b9-c742b42c141e.png)

:::note info
追加したサービスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/bef2ee60-838a-7b35-d41f-0fefefd19ce9.png)
:::
③「People」というIDで追加した場合、以下のコードで名前を取得します。
```account.js
// 名前の取得
function getName() {
  const people = People.People.get('people/me', { personFields: 'names' });
  const familyName = `${people['names'][0]['familyName']}`;
  const givenName = `${people['names'][0]['givenName']}`;
  const fullName = `${people['names'][0]['familyName']} ${people['names'][0]['givenName']}`;
  Logger.log("姓は" + familyName + "です");
  Logger.log("名は" + givenName + "です");
  Logger.log("姓+名は" + fullName + "です");
}
```
:::note alert
実行すると以下のエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/ce74ffbe-21d6-bf54-45d8-4e7d69711444.png)
:::

### OAuthスコープを追加する
OAuthスコープが不足しているため、以下の手順で追加します。
①【プロジェクトの設定】を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/61f82ce7-ea5e-a198-7f42-41b050f5c589.png)

②【「appsscript.json」マニフェスト ファイルをエディタで表示する】にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/5d53f5b2-55ec-9b4c-2aae-0171aeb2819a.png)

:::note info
エディタにappsscript.jsonが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/b9d9e4aa-3d09-a1f4-e32c-015c04bfe55d.png)
:::

③以下の情報を追記します。
　※必要なOAuthスコープはAPIの公式ドキュメントに記載されています。
　``   "oauthScopes": [
    "https://www.googleapis.com/auth/userinfo.profile"
  ]``
```appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "People",
        "version": "v1",
        "serviceId": "peopleapi"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "MYSELF"
  },
   "oauthScopes": [
    "https://www.googleapis.com/auth/userinfo.profile"
  ]
}
```

### 結果
再度実行すると、エラーが解消され名前を取得することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/7e8a5229-b4ba-b1e1-cf58-6bcf3c15c87b.png)

### その他の項目
PeopleAPIの場合、取得したい項目のpersonFieldsに修正することで他の情報を取得することが可能です。
```account.js
  const people = People.People.get('people/me', { personFields: '取得したい項目' });
```
例）
| personFields | 項目名     | 
|:-------------|----------:|
| addresses    | 住所      |
| genders      | 性別      |
| birthdays    | 生年月日  |
| organizations| 組織情報  |
| externalIds  | 外部ID    |

参考：https://developers.google.com/people/api/rest/v1/people.connections/list?hl=ja

# さいごに
Google Apps Scriptを使用してGoogleアカウントの情報を取得する方法について記載しました。
その他のGoogle Apps Script APIを使用する場合も同様の手順で取得することが可能です。
当記事が参考になれば幸いです。