5分で理解する　Google Apps Script

# はじめに
Google Apps Script（以降、GAS）はGoogleによって開発されたスクリプト言語になります。

業務でGoogleサービスを利用している場合、GASを用いることで様々な業務効率化を行うことができます。

本記事ではGASについて最速で理解することを目的に、最低限必要な知識についてまとめています。

## GAS概要
GASを始めるのに必要なのはGoogleアカウントのみです。

Googleのプラットフォーム上で動作するため、実行環境も不要です。

JavaScriptを基に作られているため、JavaScriptを知っている人なら簡単に使い始めることができます。また、学習コストも低いので非エンジニアの方でも習得して業務に活用することもできます。

## GASの活用
要約すると以下の様なことができます。

- 作成したスクリプトを使用したマクロの実行
- スプレッドシートからのメール一括送信
- Gmailに届いたメールに対するアクションの実行
- フォーム入力後、Gmailから自動返信
- カレンダーとの連携
- Webスクレイピングして収集したデータをスプレッドシートに入力  
- スプレッドシートに入力後、外部APIと連携してWebhookで通知

### 注意事項
GASを使用する際の注意事項は以下になります。

- JavaScriptとの違い  
GASはサーバーサイドで実行されるため、JavaScriptが持つWinodwオブジェクトなどの関数は実行できません。
- 実行制限  
Apps Scriptサービスには、一部の機能に1日あたりの割り当てと制限があります。クォータまたは制限を超えると、スクリプトは例外をスローし、実行が停止します。具体的には、実行時間(6分)や、実行回数に制限が設定されています。また、自動でスクリプトを起動するトリガー機能についても制限があます。制限の詳細については、[Quotas for Google Services](https://developers.google.com/apps-script/guides/services/quotas)を参照。ざっくり言うと、Google Workspace（旧 G Suite）のアカウントの場合、無料アカウントに比べて、実行時の制限が違います。


## 基本的な使い方

### スクリプトエディタの起動
はじめにスプレッドシートを開き、画面上部の**ツール**から、**スクリプトエディタ**を起動します。スクリプトエディタが表示されない場合は、Excelファイルでないことを確認してください。

![スクリーンショット 2021-01-30 16.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0290fc18-3f21-7375-001a-3e4fcc818ca6.png)

**スクリプトエディタ**が起動します。

![スクリーンショット 2021-01-30 16.26.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0ea49d3a-4d0b-cda1-738c-d96a960f8a5b.png)

### タイムゾーンの設定
スクリプトエディタを起動したデフォルトの状態では、タイムゾーンが日本時間になっていません。タイムゾーンを日本時間に変更するための方法について以下に記載します。

まずは以下のコードを実行し、現在のタイムゾーンを確認します。

![スクリーンショット 2021-01-30 18.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8c7c0c48-959f-e3e4-d55b-1a442fd9acc0.png)

画面左ペインから**プロジジェクトの設定**を開きます。

![スクリーンショット 2021-01-30 18.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/97bd2215-a22f-01b2-9070-0e7c264a2de4.png)


**「appsscript.json」マニフェスト ファイルをエディタで表示する**にチェックを入れます。

![スクリーンショット 2021-01-30 18.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f817e172-170f-f78d-f3bd-c1bddc43e610.png)

画面左ペインからエディタを選択すると、**appsscript.json**が表示されていることが確認できます。また、**timeZone**が**America/New_York**になっていることが確認できます。

![スクリーンショット 2021-01-30 18.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5d88e718-daad-c43a-f008-8cd1cf30e220.png)

**timeZone**を日本時間である**Asia/Tokyo**に変更して保存ます。

![スクリーンショット 2021-01-30 18.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/2821f179-8e59-73a2-9e87-878a9b9e17ab.png)

再度、先程のコードを実行すると、タイムゾーンが日本時間に変更されたことが確認できます。

![スクリーンショット 2021-01-30 18.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ce149a60-cb06-e251-717a-9e5f9bb403e4.png)

### ライブラリの追加
HTMLからデータを抽出することができる**Parser**ライブラリを例に解説します。
ParserはGoogleが[公開](https://script.google.com/home/projects/1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw/edit)している公式のライブラリになります。
Ivan KutilというGoogleのDeveloperの方が開発しています。

画面左ペインのエディタの中にある**ライブラリ**から、+のアイコンをクリックすると、ライブラリの追加画面が表示されます。

![スクリーンショット 2021-01-30 16.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/fae777a6-6055-3ca7-e28d-e5b5b9a3fa5c.png)

以下のスクリプトIDを入力し、「検索」ボタンをクリックします。

```
1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
```

![スクリーンショット 2021-01-30 16.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e6e40adc-32d1-6c47-fe86-327433b11991.png)


**Parser**が表示されます。

![スクリーンショット 2021-01-30 16.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ebfb9b79-887a-5c71-6ae5-f11b59c28a9f.png)

**バージョン**を8に変更して、「追加」ボタンをクリックします。

![スクリーンショット 2021-01-30 16.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/3999ffe5-6267-9b38-0dcc-ab940450a1a4.png)

ライブラリに**Parser**が追加されます。

![スクリーンショット 2021-01-30 16.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5fa0a0c4-a871-a12f-9d71-a279fe331c59.png)

### スプレッドシートの読み取り
A1にfoo、A2にvarと入力しています。

![スクリーンショット 2021-01-31 23.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/03708e42-a12b-9d69-7ed6-c7b8ddc91d46.png)

スクリプトエディタで以下のコードを入力します。

- スプレッドシートの読み取り

```javascript
function myFunction() {
  /*アクティブなシート取得*/
  var sheet=SpreadsheetApp.getActiveSheet();

  /*getRangeメソッドで操作するセルの範囲を指定*/
  var range=sheet.getRange("A1:A5");

  /*getRangeメソッドで指定したA1を起点（相対パス）に、getCellメソッドで行番号と列番号を指定してセルの値を取得*/
  var cell=range.getCell(1,1).getValue();
  console.log(cell)
}
```

初回の場合は以下の様な承認を求めるメッセージが出力されるため、「権限を確認」をクリックします。

![スクリーンショット 2021-01-31 23.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f0f09086-83dc-3835-3709-efffa6372470.png)

メールアドレスを選択します。

![スクリーンショット 2021-01-31 23.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ebf6c0b3-c2c3-b74d-9df3-020a0e15ccd8.png)

「詳細」をクリックします。

![スクリーンショット 2021-01-31 23.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cc9336fa-5023-3415-3a9a-6ce7b93a6e90.png)

「※スプレッドシートのファイル名（安全ではないページ）」に移動をクリックします。

![スクリーンショット 2021-01-31 23.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/1a99f942-a6dd-d94d-58ee-af197a17500b.png)

「許可」をクリックします。

![スクリーンショット 2021-01-31 23.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/09f65fbc-25e5-2aae-2573-e035355aa735.png)

スクリプトが実行されます。
consolelogに、A1のセルの値であるfooが出力されたことが確認できます。

![スクリーンショット 2021-01-31 23.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d289b91d-b162-5c3a-e4a1-4627803922b9.png)

### スプレッドシートの書き込み
指定したセルに入力する場合の例になります。
以下のコードを実行します。

- スプレッドシートの書き込み

```javascript
function myFunction() {
  /*アクティブなシート取得*/
  var sheet=SpreadsheetApp.getActiveSheet();

  /*getRangeメソッドで操作するセルの範囲を指定*/
  var range=sheet.getRange("A1:A5");

  /*setValueメソッドでA1を起点（相対パス）に、行番号と列番号指定してセルに書き出し*/
  var cell=sheet.getRange(4,1).setValue("test");
}
```

![スクリーンショット 2021-01-31 23.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/edec4908-1782-79be-8cc4-c9b8b7832267.png)

A4のセルに値が入力されたことが確認できます。

![スクリーンショット 2021-01-31 23.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/21b2fc33-9df8-34a6-ad54-4e5ca589a607.png)

## スクリプトの設定方法
作成したスクリプトはApps Scriptのエディタ画面から即時に実行して試すこともできますが、実際に業務で運用する場合は何かをトリガーにして使いたいと思います。その様な場面でのスクリプトの設定方法ついて以下に記載します。

### 図形にスクリプトを割り当てる
図形にスクリプトを割り当てることで、誰でも作成したスクリプトを実行することができます。
例えば、スプレッドシートの更新が終わったタイミングで担当者に通知したい状況で使えます。

はじめに図形を作成します。

![スクリーンショット 2021-02-01 21.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/17ed5436-37ea-566f-6a1e-a97dec3342b7.png)

スクリプトを割り当てたい図形を選択して**「スクリプトを割り当て」**をクリックします。

![スクリーンショット 2021-02-01 21.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/39acd4eb-7684-51c3-e024-66f16527ead4.png)

図形に割り当てたいスクリプトのスクリプト名を入力して「OK」をクリックします。

![スクリーンショット 2021-02-01 21.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ef015a5e-154a-278a-d15e-6c279a16a793.png)

Gmailの送信スクリプトを割り当てている場合は、スクリプトが実行されてメールが送信されます。

![スクリーンショット 2021-02-01 21.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/aca01d47-d8b5-ecef-dcc2-0628a2d6498a.png)

### トリガーの作成
スプレッドシートを起動したタイミングなど、実行するタイミングをコントロールするためにはトリガーを作成して設定します。

画面左ペインから**トリガー**を選択して、**「トリガーを追加」**をクリックします。

![スクリーンショット 2021-02-01 21.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/3ec02f8d-96a9-a1b9-5bd6-77084269463d.png)

トリガーの設定画面が開きます。

![スクリーンショット 2021-02-01 21.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7bdfa9e2-b505-03ad-286a-c2302e819929.png)

**イベントのソースを選択**で「スプレッドシートから」の場合、スプレッドシートを起動した時や、スプレッドシートを編集したタイミングをトリガーにしてスクリプトの実行ができます。

![スクリーンショット 2021-02-01 22.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a7c4815d-4f00-723e-61ee-3858681c6bf2.png)

スクリプトの実行を時間ドリブンで実行したい場合は、**イベントのソースを選択**のプルダウンをクリックして「時間主導型」に変更します。

![スクリーンショット 2021-02-01 22.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/682888d8-7b96-229d-52d8-d36770e1b18a.png)

作成したトリガーが表示されます。

![スクリーンショット 2021-02-01 21.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/12121a4b-3ed5-2f6f-4352-a9280f40ba86.png)

## Webスクレイピング
上記で解説した**Parser**ライブラリを使用することで、簡単なWebスクレイピングを行うことができます。

Webサービスなど他のリソースにアクセスするためには、**URL Fetch Service**サービスを使用します。

具体的には**UrlFetchApp**クラスを使用して、HTTPクライアントしてリクエストを行ない、レスポンスについては**HTTPResponse**クラスを使用することで、ステータスコードやレスポンスのボディを取得することができます。詳細については、公式リファレンスの[URL Fetch Service](https://developers.google.com/apps-script/reference/url-fetch)を参照。

html要素の取り出しはfromとtoにタグの文字列を指定し、要素が単体の場合はbulid()、複数の場合はiterate()を指定します。fromとtoには正規表現が利用できます。

```javascript
function myFunction() {
  /*指定したURLをフェッチ*/
  let response = UrlFetchApp.fetch('＜URL＞');

  /*ステータスコードの取得*/
  let code = response.getResponseCode();
  console.log(code)

  /*文字列としてエンコードされたレスポンスの取得*/
  let content = response.getContentText();

  /*パーサーで解析し、要素を取り出し*/
  let html = Parser.data(content).from('＜タグの文字列＞').to(' class="＜タグの文字列＞').iterate();
  console.log(html)
}
```

# おわりに
打ち合わせ作業の準備など普段のちょっとした作業についても、GASを活用することで時短できることがあると思います。

また、freeeはGASを用いてGoogleスプレッドシートと連携するためのAPIを公開しているため、もっと応用的な取組もできます。

GASもどんどんバージョンアップして便利になってきているので、是非業務に活用していきたいと思います。

## 参考
- [【freee API】GASを用いてGoogleスプレッドシートと連携する](https://support.freee.co.jp/hc/ja/articles/115005287286--freee-API-GAS%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6Google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B)