Google Apps Scriptを使う

[システムアイ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/systemi22)の記事となります。

# 概要

Google Apps Scriptとは、Google スプレッドシート等のGoogleのサービスで様々な自動化を行えるJavaScriptプラットフォームです。

[Google Apps Script](https://developers.google.com/apps-script)

使用例に挙げられているものは以下のようなものです。

> * Google ドキュメント、スプレッドシート、フォームにカスタム メニュー、ダイアログ、サイドバーを追加する。
> * Google スプレッドシートのカスタム関数とマクロを作成します。
> * ウェブアプリを公開（スタンドアロン、または Google サイトに埋め込んだ）
> * AdSense、アナリティクス、カレンダー、ドライブ、Gmail、マップなど、他の Google サービスを利用する。
> * アドオンを作成してGoogle Workspace Marketplace に公開します。

どうやらその気になればウェブアプリのようなものも作れるようですが、一番出番のありそうなGoogleスプレッドシートでの利用についてフォーカスしてみたいと思います。

# 実際にマクロとして使ってみる(Googleスプレッドシート)

実際にGoogleスプレッドシートでApps Scriptを利用してみようと思います。
おおよその使用の流れは以下の通りです。

1. スプレッドシートを開く
1. サブメニューの「拡張機能」→「Apps Script」を選択
1. 別なタブにApps Scriptのエディタが開く
1. 必要な処理(JavaScript)を書く
1. 関数を実行する

## 1.スプレッドシートを開く

今回はサンプルとして新規のスプレッドシートを作成し、そのシートに対しての処理を作っていきます。

![スクリーンショット 2022-11-27 125041_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/8ebd028e-9b1e-cf35-5512-407de63a545b.jpeg)

赤枠で囲われた **サンプル** というスプレッドシートで作業していきます。

## 2.サブメニューの「拡張機能」→「Apps Script」を選択

開いたスプレッドシートからApps Scriptのエディタを開きます。

![スクリーンショット 2022-11-27 125714_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/00b2434b-047f-fb24-cb29-318ba80f2c39.jpeg)

## 3.別なタブにApps Scriptのエディタが開く

以下のようなエディタの画面が表示されます。

![スクリーンショット 2022-11-27 125947.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/92bd1433-f38d-3664-77ae-60c6219e0937.jpeg)

## 4.必要な処理(JavaScript)を書く

処理を書いてみます。
今回は以下のような処理を書いてみます。

```javascript
function myFunction() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = activeSheet.getSheetByName("シート1");

  sheet.getRange("A1").setValue("Hello World!");
}
```

## 5.関数を実行する

処理を書いたら実際に動かしてみます。

Apps Scriptはクラウド上(GCP)で実行されることになります。そのため一度保存する必要があります。
保存は **実行** のボタン左にあるフロッピーのボタンで保存ができます。

![スクリーンショット 2022-11-27 131709_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/ca868ac4-fdf5-0856-233a-9bd6fd530dea.jpeg)

保存ができたら **実行** ボタンを押します。

![スクリーンショット 2022-11-27 131709_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/3601898c-f045-a672-e667-d666c87cf98c.jpeg)

実行が完了すると **実行ログ** に処理が完了したことが表示されます。

![スクリーンショット 2022-11-27 132359_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/9bce1571-97f2-b9b0-33c9-a06aff08ac83.jpeg)

すると実行結果がスプレッドシートに反映されます。

![スクリーンショット 2022-11-27 132413_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/869cdf18-dd75-1cfa-f28f-9828b57c83fc.jpeg)

### ※初回実行の場合、一度Apps Scriptがアクセス権限の確認がされます。

**権限を確認** ボタンを押します。

![スクリーンショット 2022-11-27 132227_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/5f12d492-9697-ce00-fd56-90eca2fe62ff.jpeg)

別なウィンドウが開くので、権限確認をするGoogleアカウントを選択します。

![スクリーンショット 2022-11-27 132247_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/020f205d-d9d8-cb99-bc67-def98fd5133c.jpeg)

未承認の関数のため、警告が表示されます。
**詳細** を押し、一番下にある**無題のプロジェクト（安全ではないページ）に移動**を押します。(無題のプロジェクトとなってはいますが、別途プロジェクト名を設定した場合はその名称となります。)

![スクリーンショット 2022-11-27 132303_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/83d69cdd-d365-05f4-78f9-41735cf0dd0d.jpeg)

![スクリーンショット 2022-11-27 132316_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/e708d1b2-3476-0a5d-8a89-7aa5a9795560.jpeg)

Googleアカウントへのアクセスの許可を求める表示が出てきます。**許可**を押すことで処理が実行されます。

![スクリーンショット 2022-11-27 132337_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/09f101c5-2a47-eb34-6cfa-c965aa5a60b0.jpeg)

# 自作の関数を作ってみる(Googleスプレッドシート)

Googleスプレッドシートで利用できる関数も自作できます。

今回は[openDB](https://openbd.jp/)と呼ばれる書籍情報を取得できるAPIを利用した関数を作ってみます。
openDBの利用規約等については[公式サイト](https://openbd.jp/)を参照してください。

以下の流れで自作関数を追加します。

1. コードの追加
1. (今回は追加の権限が必要なため)Apps Scriptの権限の追加
1. 実際にスプレッドシートに作った関数を使ってみる

## 1.コードの追加

以下の関数を先程作ったコードに追加します。

```javascript
/**
 * ダミーの呼び出し関数
 */
function callBookTitle() {
  console.log(getBookTitle("9784048686051")); // ダミーとして実際の書籍のISBNを設定
}

/**
 * openDBからISBNをキーに書籍のタイトルを取得
 */
function getBookTitle(isbnVal) {
  if (isbnVal == "") return ;

  const apiBaseUrl = "https://api.openbd.jp/v1/get?";
  const apiParamIsbn = "isbn=";

  var response = UrlFetchApp.fetch(apiBaseUrl + apiParamIsbn + isbnVal);
  var responseJson = JSON.parse(response.getContentText());

  return responseJson[0]["onix"]["DescriptiveDetail"]["TitleDetail"]["TitleElement"]["TitleText"]["content"];
}
```

コードを書き終わったら保存してください。

## 2.(今回は追加の権限が必要なため)Apps Scriptの権限の追加

今回はopenDB APIを利用します。外部のAPIを利用するために予めApps Scriptで権限を追加する必要があります。

関数呼び出し用のダミー関数を実行します。
複数の関数が定義されている場合、**デバッグ**ボタン右にあるプルダウンから実行する関数を選択し、**実行**ボタンを押します。
(複数の関数を定義するような状態になっていくと、実行する関数の選択を忘れている場合もあります。よく確認しましょう)

![スクリーンショット 2022-11-27 152325_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/a6497164-0c35-f3f5-9b4f-f645d9cec9d5.jpeg)

再度権限が必要である旨のメッセージが表示されます。**権限を確認**ボタンを押します。

![スクリーンショット 2022-11-27 151034_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/2478c736-8f27-4082-aced-78d94a1a0961.jpeg)

別なウィンドウが開き、権限確認をするGoogleアカウントを選択します。
選択後にアクセス許可を求める表示が出てきます。

![スクリーンショット 2022-11-27 151105_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/09bf46a9-c005-b17e-cf69-5e7b434b0e2a.jpeg)

青枠で囲っているものが追加を要求されている権限です。**許可**ボタンを押して権限を付与します。

付与が完了すると関数が実行され、実行ログ部分に結果が表示されます。

## 3.実際にスプレッドシートに作った関数を使ってみる

作った関数を実際にスプレッドシートで使ってみます。
適当なセルに以下の数式を入力します。(引数のISBNはお好みのものをご利用ください。)

```
=getBookTitle("978-4-04-868605-1")
```

APIの結果を解析され、以下のように表示されれば自作関数が動いています。

![スクリーンショット 2022-11-27 154105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952454/8f310043-204e-3152-044c-2743a2743d76.jpeg)

# まとめ

GoogleスプレッドシートでのApps Scriptの利用について、簡単にですがまとめてみました。
マクロは表計算ソフトとしては拡張性のキモとなる機能です。このような形でGoogleスプレッドシートを有効活用ができることを知っていただければと思います。