スプレッドシートでマクロを使う

# はじめに

GoogleスプレッドシートはExcelなどのように Google Apps Script (GAS) を使ってマクロを記録・作成することができます。


# マクロの利用方法

## マクロの記録

スプレッドシート上での操作をマクロとして記録する手順は以下の通りです。

1. スプレッドシートを開く
    新規または既存のGoogleスプレッドシートを開いてください。
    <br>
1. マクロの記録を開始する
    メニュー欄から「拡張機能」→「マクロ」→「マクロを記録」と順に選択する。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/623d88d8-3462-fa04-97e2-c7424a539eb2.png)
    <br>

1. 記録したい操作を実行する
    マクロとして記録したい操作をスプレッドシート上で実行して「保存」ボタンをクリックする。
    ※ 操作を実行する前に絶対参照か相対参照を選択するのを忘れないようにしましょう！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/e2b60d47-d13e-2fc1-6063-4231a50ea679.png)
    <br>

1. マクロに名前を付けて保存する
    マクロに分かりやすい名前を付けて保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/d81b2db7-c623-46c8-1b70-dd0aa724daeb.png)
    <br>

1. マクロの中身を確認する
    記録されたマクロはGASのスクリプトエディタに「マクロ.gs」という名前のファイルに保存されます。
    メニュー欄から「拡張機能」→「Apps Script」と選択して中身を確認してみましょう。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/2e5959db-27d2-8fd6-8e86-daed3b183b0c.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/9b0955a7-54c7-8368-e98d-403687840e4e.png)
    <br>

1. マクロを管理する
    スクリプトエディタに「マクロ.gs」というファイルを作成するとマクロを管理するメニューが有効になります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/08b9cd6c-4f6c-824e-8e1b-e400c5e0b54a.png)
    <br>


## マクロの作成

マクロはスプレッドシート上の操作を覚えさせるだけでなくユーザが手動で作成することもできます。

1. スクリプトエディタを開く
    メニュー欄から「拡張機能」→「Apps Script」と選択してスクリプトエディタを開いてください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/7c0e2cf5-6c68-d8dc-9939-b51356954214.png)

1. マクロ.gsを作成する
    「ファイル」欄の右横の＋アイコンを選択して「スクリプト」メニューから「マクロ」という名前のファイルを作成します。
    ※ ファイル名を編集する際、拡張子の「.gs」を付けると「.gs.gs」になるので気を付けてください！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/472fd667-4726-e9c0-b6be-8818373dadc8.png)
    <br>

1. マクロを編集する
    サンプルとして以下のようなマクロを作成して「Ctrl+S」で保存してください。

    ```javascript
    function setTwo() {
      let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      let cell = spreadsheet.getActiveCell();
      cell.setValue(2);
    }
    ```
    <br>

1. appsscript.jsonを表示する
    マクロの登録はスプレッドシートで「拡張機能」→「マクロ」→「マクロをインポート」からも実施できますが、スクリプトエディタで登録する場合はまず左側メニューの歯車アイコンの「プロジェクトの設定」で「「appsscript.json」マニュフェストファイルをエディタで表示する」にチェックを入れます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/c085524a-c297-9058-564e-469485436c44.png)
    <br>

1. appsscript.jsonを編集する
    左側メニューで「エディタ」を選択してappsscript.jsonファイルを開き、次のように編集して保存しましょう。
    ```json
    {
      "timeZone": "Asia/Tokyo",
      "dependencies": {
      },
      "exceptionLogging": "STACKDRIVER",
      "runtimeVersion": "V8",
      "sheets": {
        "macros": [{
          "menuName": "setTwo",
          "functionName": "setTwo",
          "defaultShortcut": "Ctrl+Alt+Shift+1"
        }]
      }
    }
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/ee047f25-dc10-3c2a-c48e-9016fb6aa538.png)
    <br>

1. マクロを確認する
    appsscript.jsonを編集すればスプレッドシートには即座に操作が反映されます。
    メニュー欄から「拡張機能」→「マクロ」と順に選択するとマクロが追加されていることが確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/29eb6453-fd1e-a1e2-7ef4-148ad7e68cc1.png)

## マクロの実行

ここまではマクロの作成方法を紹介してきましたが、最後にマクロの実行方法にはいくつかのオプションがあることを紹介します。


### メニューから実行する

メニューから実行する方法は一番シンプルです。
マクロを作成したら「拡張機能」→「マクロ」と順に選択して使用したいマクロ名をクリックすればマクロが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/3f880596-4d57-3f15-c363-4ca24fc37680.png)


### ショートカットで実行する

マクロの作成時にショートカットキーを設定すればマクロをショートカットキーから実行することも可能です。

ただし、ショートカットキーは「Ctrl+Shift+Alt」のあとに 0～9 の数字を割り当てるので10種類までしか登録できないことに注意が必要です。

### ボタンなどのUIに紐づける

マクロをはじめとするGASの関数はスプレッドシート上に配置された図形や画像などのオブジェクトに紐づけることができます。

以下はボタンのような図形を挿入してマクロと紐づける例です。

1. 図形を描画する
    メニュー欄から「挿入」→「図形描画」を選択して適当な図形を挿入してください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/f7f723d1-f1ea-7b69-7488-8450ba8a50c4.png)
    <br>

1. オブジェクトにマクロを紐づける
    図形の右上に表示されるオプションボタンクリックして「スクリプトの割り当て」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/bdf6b2c0-ca9b-c756-06e0-a154f597b436.png)

1. 関数名を入力
    「スクリプトを割り当て」モーダルが開くので、オブジェクトをクリックしたときに実行させたい関数名を入力して「確定」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/18c71e32-47ad-2f9f-18a9-51835147caf2.png)
    <br>

1. 左クリックで実行
    オブジェクトにマクロを紐づけると、以降はそのオブジェクトを左クリックするとマクロが実行されるようになります。
    ※ オブジェクトを編集したい場合は右クリックしてください。

### トリガーを設定する

Excelのマクロはブックを開いたときに実行させるなど、特定のイベントをトリガーにすることができますが、スプレッドシートもこれと同様にGASで定義した関数を特定のイベントに紐づけることができます。

以下は30分ごとにドル・円の為替レートを取得してA1セルに格納する時間主導型のマクロを埋め込む例です。

1. スクリプトエディタを開く
    メニュー欄から「拡張機能」→「Apps Script」と選択してスクリプトエディタを開いてください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/594c202f-9daa-6377-fa17-b65df248f227.png)
    <br>

1. マクロを作成する
    マクロ.gsというファイルに次のような関数を追加します。

    ```javascript
    function getExchangeRate() {
        // USD基準の為替レートを取得するAPIのエントリポイントを定義
        let url = "https://api.exchangerate-api.com/v4/latest/USD";
        try {
            // JPY（日本円）の為替レートを取得
            let response = UrlFetchApp.fetch(url);
            let json = JSON.parse(response.getContentText());
            let rate = json.rates.JPY;
            
            // A1セルに為替レートを入力
            let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
            let sheet = spreadsheet.getSheetByName('シート1');
            let cell = sheet.getRange('A1');
            cell.setValue(rate);
        } catch (e) {
            Logger.log("Error: " + e.message);
            throw new Error("為替レートの取得に失敗しました");
        }
    }
    ```
    <br>

1. トリガーを追加する
    トリガーはスクリプトエディタの左側メニューの「トリガー」からも設定できますが、より細かい設定を適用したい場合はプログラムから設定することもできます。

    以下のように30分おきに関数を実行する時間主導のトリガーを設定する関数を作成して実行しましょう。

    ```javascript
    function createTimeDrivenTriggers() {
        ScriptApp.newTrigger('getExchangeRate')
                 .timeBased()
                 .everyMinutes(30)
                 .create();
    }
    ```
    :::note info

    #### トリガーの種類

    <details>

    - [シンプルトリガー](https://developers.google.com/apps-script/guides/triggers?hl=ja)：
        ファイルを開くなどの特定のイベントと紐づけられたトリガー。  
        以下の名前の関数を定義することで自動的にセットされる。

        - onOpen(e)：GoogleWorkspaceアプリを開いたときに呼び出される
        - onInstall(e)：アドオンのインストールしたときに呼び出される
        - onEdit(e)：スプレッドシートの値が変化したときに呼び出される
        - onSelectionChange(e)：スプレッドシートの選択範囲を変更したときに呼び出される
        - doGet(e)：WebアプリがHTTP GETリクエストを受信したときに呼び出される
        - doPost(e)：WebアプリがHTTP POSTリクエストを受信したときに呼び出される
        <br>

    - [インストール可能なトリガー](https://developers.google.com/apps-script/guides/triggers/installable?hl=ja)：
        AppsScriptエディタのUIやGASのコードで設定するトリガー。
        
    </details>

:::
<br>

1. トリガーを確認する
    スクリプトエディタの左側メニューの「トリガー」を選択するとアクティブなトリガーの一覧を確認できます。
    トリガーが正常に設定されていれば30ごとに最新の為替レートがスプレッドシートのA1セルに格納されるはずです。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/705bc82e-7a57-d14b-293f-2089b02cf31c.png)


    :::note warn
    
    #### トリガーのクリーンアップ

    <details>
    GASの関数はアカウントごとに１日の実行回数の上限が設けられています。
    動作確認などでトリガーを設定した方はスクリプトエディタの「トリガー」メニューから該当のトリガーを削除するなど、１日の実行回数制限を圧迫しないようにクリーンアップを忘れないでください。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/a0cd50fc-828d-83ee-c50b-299544836542.png)
    
    </details>
:::