# Google Apps Script

## Google Apps Scriptの概要

\
Google Apps Script（GAS）は、Googleのクラウドベースのプラットフォームであり、Google Workspaceの各種アプリケーションでカスタムな自動化や機能拡張を行うためのスクリプト言語です。GASはJavaScriptをベースとしており、スプレッドシート、ドキュメント、フォーム、カレンダー、GmailなどのGoogleサービスとシームレスに連携できます。

GASの利点と可能性は以下のようなものがあります：

1. 自動化と効率化: GASを使用することで、繰り返し行う作業や手作業が必要なタスクを自動化できます。たとえば、スプレッドシートのデータ処理やメールの自動送信などがあります。これにより、時間と労力を節約し、作業の効率を向上させることができます。
2. カスタマイズと機能拡張: GASを使用することで、Googleサービスの既存の機能をカスタマイズしたり、新しい機能を追加したりすることができます。たとえば、スプレッドシートに独自の関数を追加したり、ドキュメントにテキスト操作の機能を追加したりすることができます。
3. データの統合と処理: GASを使用すると、複数のGoogleサービス間でデータを連携させたり、外部のAPIとデータをやり取りしたりすることができます。たとえば、スプレッドシートのデータをGoogleカレンダーに同期させたり、外部ウェブサービスとデータを連携させたりすることができます。
4. ワークフローの改善と共同作業: GASはチームでの作業や共同開発にも適しています。複数の開発者が同じGASプロジェクトにアクセスして共同作業することができます。また、バージョン管理システム（例: GitHub）と組み合わせることで、変更履歴の追跡やバージョン管理が容易になります。

以上が、Google Apps Script（GAS）の概要とその利点、可能性についての説明です。GASを活用することで、Googleのさまざまなサービスをより効果的に活用し、カスタマイズされた自動化ソリューションを作成できます。

## スクリプトエディタの基本とローカル開発環境

### スクリプトエディタのインターフェース

* スクリプトエディタにアクセスするには、Googleサービス内でスクリプトを作成または開いて「ツール」→「スクリプトエディタ」を選択します。または、直接以下のURLにアクセスします: [https://script.google.com](https://script.google.com/)
* スクリプトエディタは、メニューバー、エディタペイン、サイドバーなどで構成されています。
* メニューバーには、スクリプトの実行やデバッグ、設定などの操作があります。
* エディタペインは、スクリプトのコードを入力、編集するための領域です。
* サイドバーには、プロジェクトのファイル一覧や追加のリソース、トリガーの設定などがあります。

### スクリプトファイルの作成と保存

* スクリプトファイルを作成するには、スクリプトエディタのメニューバーから「ファイル」→「新規作成」を選択します。
* スクリプトファイルは、Google Apps Scriptプロジェクト内で複数のファイルを持つことができます。新しいファイルを作成するには、サイドバーの「ファイル」→「新しいスクリプトファイル」を選択します。
* スクリプトファイルは自動的に保存されますが、手動で保存するには「ファイル」→「保存」またはキーボードショートカットのCtrl + S（Windows）またはCmd + S（Mac）を使用します。

### コードの書式設定とコメント

* コードの書式設定は、読みやすさと一貫性を確保するために重要です。スクリプトエディタでは、自動的にコードのインデントやスペースの配置を整えることができます。
* コードを整形するには、エディタペインでコードを選択し、メニューバーの「編集」→「整形」を選択します。
* コメントは、コードの理解やドキュメンテーションを助けるために使用されます。コメントは、//（単一行コメント）または/\* \*/（複数行コメント）で囲まれたテキストとして追加できます。

### ローカル開発環境のセットアップ

* ローカル開発環境をセットアップすることで、より柔軟な開発とデバッグが可能になります。Clasp（Command Line Apps Script Projects）と呼ばれるツールを使用します。
* Node.jsをインストールします（[https://nodejs.org](https://nodejs.org/) からダウンロードできます）。
* ターミナルまたはコマンドプロンプトを開き、`npm install @google/clasp -g`と入力してClaspをグローバルにインストールします。
* ローカルプロジェクトの作成と関連付けは、`clasp create`コマンドを使用して行います。
* ローカル開発環境では、ローカルのテキストエディタを使用してスクリプトを編集し、`clasp push`コマンドで変更をリモートにプッシュします。

## JavaScriptの基礎

### 変数とデータ型

* 変数の宣言と初期化: `let` や `const` キーワードを使用して変数を宣言し、適切な値で初期化します。
* データ型: JavaScriptの基本的なデータ型には、数値（`number`）、文字列（`string`）、真偽値（`boolean`）、配列（`array`）、オブジェクト（`object`）などがあります。適切なデータ型を使用して変数を定義します。

### 条件分岐とループ

* 条件分岐: `if` 文を使用して条件式を評価し、条件に応じた処理を実行します。`if-else` 文や `switch` 文などを使って複数の条件を処理する方法もあります。
* ループ: `for` ループや `while` ループなどを使用して、特定の条件下でコードを繰り返し実行します。ループ内でインデックスやカウンターを使用して制御します。

### 配列とオブジェクト

* 配列: `[]` 内に要素をカンマ区切りで指定し、配列を作成します。配列内の要素にはインデックス番号を使用してアクセスできます。配列に要素を追加したり削除したりする方法もあります。
* オブジェクト: `{}` 内にキーと値のペアを指定し、オブジェクトを作成します。オブジェクトのプロパティにはドット記法やブラケット記法を使用してアクセスできます。オブジェクトに新しいプロパティを追加したり、既存のプロパティを変更したりすることもできます。

### 関数の作成と呼び出し

* 関数の作成: `function` キーワードを使用して関数を定義します。関数名と引数を指定し、関数内の処理を記述します。必要に応じて戻り値を返すこともできます。
* 関数の呼び出し: 定義した関数を呼び出すには、関数名と引数を指定します。関数が戻り値を返す場合は、それを変数に代入したり、他の処理で使用したりすることができます。

## Google Apps Scriptの基本操作

### スクリプトの実行方法

* スクリプトの実行は、スクリプトエディタ内で行います。例えば、関数を作成している場合は、関数名を指定して実行します。
* スクリプトエディタのメニューバーにある再生ボタン（▶️）をクリックすると、現在開いているスクリプトファイル内の関数が実行されます。

### ログの表示とデバッグ

* `console.log()` メソッドを使用してログを表示することで、スクリプトの実行中に特定の値やメッセージを確認できます。
* 例えば、`console.log("Hello, world!")` というコードをスクリプト内に追加すると、実行時に "Hello, world!" がログに表示されます。

### メッセージボックスとダイアログの表示

* `Browser.msgBox()` メソッドを使用して、スクリプトの実行中にメッセージボックスを表示することができます。メッセージボックスにはタイトルとメッセージを指定します。
* 例えば、`Browser.msgBox("Hello", "Welcome to GAS!")` というコードを実行すると、タイトルが "Hello"、メッセージが "Welcome to GAS!" のメッセージボックスが表示されます。

### イベントトリガーの設定

* イベントトリガーは、特定のイベント（例: スプレッドシートの変更、フォームの送信）が発生した際にスクリプトを実行する機能です。
* イベントトリガーを設定するには、スクリプトエディタのメニューバーから「編集」→「現在のプロジェクトのトリガー」を選択します。
* トリガーの設定画面で、イベントの種類、実行する関数、トリガーの頻度などを指定します。

## Google Apps Scriptの基本機能

### スプレッドシートの操作

* スプレッドシートを操作するためには、`SpreadsheetApp` クラスのメソッドを使用します。
* 例えば、新しいスプレッドシートを作成するには `SpreadsheetApp.create('新しいスプレッドシート')` というコードを使用します。
* スプレッドシートのセルの値を取得するには `getValue()`、セルの値を設定するには `setValue()` メソッドを使用します。

### Gmailの送受信

* Gmailを操作するためには、`GmailApp` クラスのメソッドを使用します。
* 例えば、メールを送信するには `GmailApp.sendEmail('example@gmail.com', '件名', '本文')` というコードを使用します。
* 受信したメールを取得するには `getInboxThreads()` メソッドを使用し、スレッド内のメッセージを取得するには `getMessages()` メソッドを使用します。

### ドキュメントの作成と編集

* ドキュメントを操作するためには、`DocumentApp` クラスのメソッドを使用します。
* 例えば、新しいドキュメントを作成するには `DocumentApp.create('新しいドキュメント')` というコードを使用します。
* ドキュメントの本文を取得するには `getBody()` メソッドを使用し、本文にテキストを追加するには `appendParagraph('テキスト')` メソッドを使用します。

### カレンダーの操作

* カレンダーを操作するためには、`CalendarApp` クラスのメソッドを使用します。
* 例えば、新しい予定を作成するには `CalendarApp.getDefaultCalendar().createEvent('イベント', new Date('2023-06-30T09:00:00'), new Date('2023-06-30T10:00:00'))` というコードを使用します。
* カレンダーの予定を取得するには `getEvents()` メソッドを使用し、予定のプロパティ（タイトル、開始日時、終了日時など）にアクセスします。

## カスタム関数の作成

### カスタム関数の概要

* カスタム関数は、ユーザーが独自の関数を作成してスプレッドシートやその他のGoogle Appsで使用することができます。
* カスタム関数は、既存の関数と同様にセルに入力して実行することができますが、自身で定義したロジックに基づいて結果が計算されます。

### 関数の引数と戻り値

* 関数の引数は、関数に渡される値やデータです。関数が特定の操作を実行するために必要な情報を提供します。
* 関数の戻り値は、関数の実行結果として返される値です。関数の処理結果や計算結果などを戻り値として返すことができます。

### カスタム関数の作成と利用

* カスタム関数を作成するには、スクリプトエディタ内で関数を定義します。関数は、`function` キーワードを使用して作成されます。
* 例えば、以下のようなカスタム関数を作成することができます:

  ```javascript
  function myFunction(arg1, arg2) {
    // 関数の処理
    return arg1 + arg2;
  }
  ```
* カスタム関数を利用するには、スプレッドシートのセル内に関数名と引数を指定します。例えば、`=myFunction(A1, B1)` のように使うことができます。

## 外部APIの使用

### 外部APIの概要と利用方法

* API（Application Programming Interface）は、プログラムが他のプログラムやサービスと通信するための規約や方法論です。
* Google Apps Scriptでは、URL Fetch Serviceや組み込みのHTTPリクエストメソッドを使用して外部APIを利用します。

### APIキーの取得と認証

* 外部APIを使用する際には、APIキーを取得する必要があります。APIキーは、APIサービスプロバイダから提供されます。
* APIキーを取得する手順や認証方法は、APIサービスプロバイダのドキュメントやウェブサイトに記載されています。
* 取得したAPIキーをGoogle Apps Scriptのスクリプト内で使用することで、APIへのアクセス権限を取得します。

### APIリクエストの送信とデータの取得

* Google Apps Scriptでは、外部APIとのデータの送受信にURL Fetch Serviceを使用します。
* `UrlFetchApp.fetch()` メソッドを使用してAPIリクエストを送信し、データを取得します。
* APIリクエストには、URLやHTTPメソッド（GET、POSTなど）を指定し、必要な場合にはヘッダーやパラメータを設定します。
* 取得したデータは、JSON形式などで返される場合が一般的です。取得したデータを解析して必要な情報を抽出し、Google Apps Script内で利用することができます。

### API呼び出しの例

```javascript
function fetchExternalData() {
  // 外部APIのエンドポイントURL
  const apiUrl = 'https://api.example.com/endpoint';

  // APIリクエストのオプション設定
  const options = {
    method: 'GET', // HTTPメソッド（GET, POST, PUT, DELETEなど）
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY', // 認証ヘッダーなど
      'Content-Type': 'application/json' // リクエストのコンテンツタイプ
    },
    muteHttpExceptions: true // HTTPエラー時に例外をスローしない
  };

  // APIリクエストの送信
  const response = UrlFetchApp.fetch(apiUrl, options);

  // レスポンスデータの取得
  const responseData = response.getContentText();
  const parsedData = JSON.parse(responseData);

  // レスポンスデータの処理
  // ...

  // 処理結果の返却など
  // ...
}
```

上記の例では、`UrlFetchApp.fetch()` メソッドを使用して外部APIにGETリクエストを送信しています。`apiUrl` 変数にはAPIのエンドポイントのURLを指定し、必要に応じて認証情報やヘッダーを設定します。`response` 変数にはAPIからのレスポンスが格納されます。

APIから返されたレスポンスデータは、`response.getContentText()` メソッドを使用して取得します。その後、必要に応じてデータの解析や処理を行います。

なお、上記のコードは一般的な外部APIの呼び出しの例です。具体的なAPIにはAPIドキュメントや仕様を参照し、必要なヘッダーやパラメータ、認証情報などを適切に設定してください。

## Google Workspaceの統合

### Google Driveの操作

* Google Driveを操作するためには、`DriveApp` クラスのメソッドを使用します。
* ファイルやフォルダの作成、移動、削除などの操作が可能です。
* 例えば、新しいフォルダを作成するには `DriveApp.createFolder('新しいフォルダ')` というコードを使用します。

### Google Calendarの操作

* Google Calendarを操作するためには、`CalendarApp` クラスのメソッドを使用します。
* カレンダーのイベントの作成、取得、変更、削除などが可能です。
* 例えば、新しいイベントを作成するには `CalendarApp.getDefaultCalendar().createEvent('イベント', new Date('2023-06-30T09:00:00'), new Date('2023-06-30T10:00:00'))` というコードを使用します。

### Google Formsの操作

* Google Formsを操作するためには、`FormApp` クラスのメソッドを使用します。
* フォームの作成、質問の追加、回答の収集などが可能です。
* 例えば、新しいフォームを作成するには `FormApp.create('新しいフォーム')` というコードを使用します。

### Google Analyticsのデータ取得

* Google Analyticsのデータを取得するには、Google Analytics Reporting APIを使用します。
* `UrlFetchApp.fetch()` メソッドを使用してAPIリクエストを送信し、データを取得します。
* 取得したデータは、JSON形式などで返される場合が一般的です。取得したデータを解析して必要な情報を抽出し、Google Apps Script内で利用することができます。

## 高度なスクリプトの作成

### ライブラリの利用

* ライブラリは、Google Apps Scriptの再利用可能なコードのコレクションです。外部のスクリプトをライブラリとしてプロジェクトに追加し、その関数やオブジェクトを利用できます。
* ライブラリを使用するには、スクリプトエディタのメニューバーから「リソース」→「ライブラリ」を選択し、ライブラリのスクリプトIDを指定します。
* ライブラリの関数やオブジェクトは、自身のスクリプト内で利用することができます。

### HTMLサイドバーとダイアログの作成

* HTMLサイドバーやダイアログを作成することで、Google Apps Scriptのスクリプトエディタ内でユーザーインターフェースをカスタマイズできます。
* HTMLファイルを作成し、スクリプト内で `HtmlService` クラスのメソッドを使用して表示します。
* 例えば、`HtmlService.createHtmlOutputFromFile('sidebar.html').setTitle('サイドバー')` のようなコードを使用してサイドバーを作成し表示します。

### Webアプリケーションの作成

* Google Apps Scriptを使用してWebアプリケーションを作成することができます。Webアプリケーションは、外部からアクセスできるURLを提供し、ユーザーとの対話的なインタラクションやデータの処理を行うことができます。
* `doGet()` または `doPost()` 関数を作成し、それをWebアプリケーションのエンドポイントとして使用します。
* 例えば、`return HtmlService.createHtmlOutput('Hello, world!');` のようなコードを使用してWebアプリケーションの出力を定義します。

### Add-onの作成

* Add-onは、Google Workspace製品（Google Docs、Sheets、Gmailなど）に機能を追加するための拡張機能です。
* Add-onを作成するには、スクリプトエディタで新しいプロジェクトを作成し、Add-onのタイプに応じた関数とメソッドを実装します。
* Add-onの設定やメニューの作成、トリガーの設定など、特定の製品に対して動作するように設定します。

## GitHubとの連携

### GASプロジェクトのバージョン管理の重要性

* Google Apps Scriptプロジェクトのバージョン管理は、プロジェクトの変更履歴やバージョン間の比較、バージョンの回復などを容易にするために重要です。
* プロジェクトの変更をトラックすることで、バグの特定や機能の追加/削除などの作業を追跡できます。
* バージョン管理により、チームでの共同作業や異なるバージョン間の切り替えが容易になります。

### GitHub Actionsとの連携

```yaml
name: GAS Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Install clasp
        run: npm install -g @google/clasp

      - name: Login to clasp
        env:
          CLASP_CLIENT_ID: ${{ secrets.CLASP_CLIENT_ID }}
          CLASP_CLIENT_SECRET: ${{ secrets.CLASP_CLIENT_SECRET }}
          CLASP_REFRESH_TOKEN: ${{ secrets.CLASP_REFRESH_TOKEN }}
        run: clasp login --no-localhost

      - name: Clone Apps Script project
        run: clasp clone <script_id> --rootDir ./src

      - name: Deploy to Apps Script
        working-directory: ./src
        run: clasp push
```

上記の設定ファイルは、GitHubリポジトリの`main`ブランチに対してのプッシュイベントがトリガーとなり、自動デプロイが実行されるように設定する例です。設定ファイル内の `<script_id>` 部分には、デプロイするGoogle Apps ScriptプロジェクトのスクリプトIDを指定します。

この設定では、GitHub Actionsのワークフロー内で以下の手順が実行されます:

1. リポジトリのチェックアウト（`actions/checkout`アクションを使用）。
2. `clasp`のインストール（`npm install -g @google/clasp`を実行）。
3. `clasp`へのログイン（環境変数を使用して`clasp login`を実行）。
4. Google Apps Scriptプロジェクトのクローン（`clasp clone`を実行）。
5. Apps Scriptへのデプロイ（`clasp push`を実行）。

上記の設定ファイルでは、`secrets`セクションに`CLASP_CLIENT_ID`、`CLASP_CLIENT_SECRET`、`CLASP_REFRESH_TOKEN`といった環境変数を使用しています。これらの値は、GitHubリポジトリのSecretsに設定しておく必要があります。

## セキュリティと機密情報の管理

### 環境変数のセットアップと利用

* 環境変数は、スクリプト内で使用される機密情報や設定値を保持するために使用されます。
* 環境変数をセットアップするには、スクリプトエディタのメニューバーから「ファイル」→「プロジェクトのプロパティ」→「スクリプトのプロパティ」を選択し、プロパティと値の組み合わせを設定します。
* スクリプト内で環境変数を利用するには、`PropertiesService` クラスのメソッドを使用して値を取得します。

### 機密情報の暗号化と保護

* 機密情報（例: APIキー、パスワードなど）をスクリプト内に直接埋め込むことはセキュリティ上のリスクです。
* 機密情報を保護するためには、暗号化やハッシュ化などの手法を使用します。
* Google Apps Scriptでは、`ScriptProperties` クラスや `PropertiesService` クラスを使用して機密情報を暗号化し、保護することができます。

### セキュアな開発プラクティスの実践

* セキュアな開発プラクティスを実践することは、スクリプトのセキュリティを確保するために重要です。
* 以下はセキュアな開発プラクティスの一部の例です:
  * 不要な権限を持つスコープを避け、最小限の権限を使用する。
  * 定期的にスクリプトや関連するライブラリをアップデートする。
  * 定期的な脆弱性スキャンやセキュリティ監査を実施する。
  * セキュリティに関連するログを記録し、監視する。

## ベストプラクティスとデバッグ

### エラーハンドリングと例外処理

* エラーハンドリングと例外処理は、スクリプトの安定性とエラー管理のために重要です。
* `try-catch`文を使用してエラーをキャッチし、例外処理を行います。
* エラーメッセージの表示やログへの出力、適切なエラーハンドリングの設定などを行います。

```javascript
try {
  // エラーが発生する可能性のあるコード
} catch (error) {
  // エラーハンドリングの処理
  console.error('エラーが発生しました:', error);
}
```

### パフォーマンスの最適化

* パフォーマンスの最適化は、スクリプトの実行速度やリソース使用量の改善を目指します。
* 冗長な処理の削除、効率的なアルゴリズムの選択、キャッシュの利用などがパフォーマンスの向上に寄与します。

```javascript
// 冗長な処理の例（改善前）
for (let i = 0; i < 10000; i++) {
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(i);
}

// 冗長な処理の例（改善後）
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getRange('A1');
for (let i = 0; i < 10000; i++) {
  range.setValue(i);
}
```

### コーディングスタイルと可読性

* コーディングスタイルと可読性の向上は、スクリプトの保守性や共同作業の円滑さに寄与します。
* 適切なインデント、意味のある変数名、コメントの追加などによってコードを読みやすくします。

```javascript
// コーディングスタイルの例
function calculateSum(a, b) {
  // 変数名や関数名に意味を持たせる
  const sum = a + b;

  // 読みやすいコードにする
  return sum;
}
```

### デバッグのテクニック

* デバッグはスクリプトの問題解決において重要なスキルです。
* `Logger`クラスを使用してログを出力し、変数の値やメッセージを確認します。
* `console.log()`や`console.error()`を使用してコンソールにメッセージを表示します。

```javascript
// ログの出力例
function calculateSum(a, b) {
  const sum = a + b;
  Logger.log('合計値:', sum);
  return sum;
}
```

## 次のステップ

### Google Apps Scriptを学ぶ上での資料とリソース

* 公式ドキュメント: Google Apps Scriptの公式ドキュメントは、基本的な概念から高度なテクニックまで、幅広い情報を提供しています。公式ドキュメントには、クイックスタートガイド、リファレンス、チュートリアルなどが含まれています。
* サンプルコード: Google Apps Scriptのサンプルコードは、公式ドキュメントやGoogle Developersのサンプルコードリポジトリで入手できます。これらのサンプルコードを実際に試してみることで、機能や利用方法を理解することができます。
* コミュニティフォーラム: Google Apps Scriptのコミュニティフォーラムは、ユーザー間での質問や情報共有の場となっています。フォーラムを通じて他のユーザーと交流し、知識や経験を共有することができます。

### Google Apps Scriptの将来のトレンドと更新情報の追跡方法

* Google Apps Scriptの将来のトレンドや更新情報を追跡するためには、以下の方法を活用できます:
  * Google Developers ブログ: Google Developers ブログは、Google Apps Scriptの新機能やアップデートに関する公式なアナウンスや情報を提供しています。ブログの定期的なチェックやRSSフィードの購読によって最新情報を入手できます。
  * Google Apps Scriptの公式Twitterアカウント: @AppsScriptInfo は、Google Apps Scriptの公式Twitterアカウントです。ここでは、新機能、リソース、ヒントなどの情報が共有されます。
  * 開発者向けニュースレター: Google Developersのニュースレターに登録することで、Google Apps Scriptを含むさまざまな開発者向けのニュースやリソースを受け取ることができます。
