GASのさらに高度なテクニック:非同期処理、プロパティサービス、Webhookチェーン

さて、今度はさらに深淵な自動化のテクニックに手を出すとしよう。キーワードは「非同期処理」「プロパティサービス」「Webhookチェーン」の3つだ。どうだい?ちょっと本格的なプログラミングっぽくてワクワクするだろう?


ディープトリック・その1:非同期処理で複数のタスクを並列に処理する

実際には、GAS(Google Apps Script)自体はJavaScriptのように非同期処理(Promiseやasync/await)を直接扱えないが、それでも複数のタスクをできる限り同時に進行させるテクニックは存在する。この手法は、特に複数のAPIリクエストや外部サービスとの通信が絡む場合、プロセスのスピードアップに大きく貢献する。

1. 複数のリクエストを一斉に実行する理由

通常、APIリクエストを順番に処理する場合、1つのリクエストが完了するまで次のリクエストは待たされる。APIへの呼び出し時間が各々1〜2秒でも、連続するリクエストが5つもあれば、簡単に10秒以上かかってしまう。

これを効率化するために、リクエストを一斉に発行して処理する方法がGASにはある。GASはURLFetchAppのリクエストを並行して実行できるため、それらをリストにまとめ、処理が完了するまで待たずに次のリクエストを発行することで、結果的にプロセス全体を短縮できる。

function fetchMultipleData() {
  const urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
  ];

  // 複数のAPIリクエストを一斉に発行
  const fetchData = urls.map(url => {
    return UrlFetchApp.fetch(url);  // 各APIからデータ取得
  });

  // 取得したデータを一度に処理
  const results = fetchData.map(response => JSON.parse(response.getContentText()));
  
  results.forEach((result, index) => {
    Logger.log(`Data from API ${index + 1}: ${result}`);
  });
}

2. 処理の流れ

  1. urls配列に複数のAPIエンドポイントをリスト化。
  2. mapメソッドを使用して、各URLに対してUrlFetchApp.fetch()を非同期的に発行。
  3. 全てのリクエストが完了後、返されたデータをJSON.parseで解析し、リスト化。
  4. 解析したデータを順番に処理し、Logger.log()で確認。

この方法を使うと、1つ1つリクエストの完了を待つよりも大幅に時間を短縮できる。特に、APIリクエストがネットワーク遅延やサーバーの応答待機時間に依存する場合、このような並列処理が役立つ。


ディープトリック・その2:状態管理をGASに持たせ、条件分岐を動的に操作する

次に取り上げるトリックは、GASの中で「状態管理」を行う方法だ。通常、GASスクリプトは一度実行されるとリセットされるが、プロパティサービスを利用すれば、スクリプトが複数回実行されても状態を保持し、条件に応じて異なる処理を動的に行える。

1. プロパティサービスの利点

GASのプロパティサービスには3種類(スクリプトプロパティ、ユーザープロパティ、ドキュメントプロパティ)があり、いずれもシンプルなキー-バリュー形式でデータを保存できる。これを利用して、ある状態に応じた分岐処理を作成するのが、このトリックのポイントだ。

例えば、特定のステップを完了したら次のステップへ進む、といったステージ制のタスク管理に活用できる。複数回に分けて実行される処理でも、前回の実行結果に応じて次の処理が変わる仕組みを作ることができる。

function manageState() {
  // ユーザープロパティサービスを取得
  const userProperties = PropertiesService.getUserProperties();
  
  // 現在の状態を取得、なければ初期状態を'STEP_1'とする
  const currentState = userProperties.getProperty('process_state') || 'STEP_1';
  
  // 各状態に応じた処理を実行
  if (currentState === 'STEP_1') {
    Logger.log('STEP 1: データ収集');
    // 次のステップへ状態を更新
    userProperties.setProperty('process_state', 'STEP_2');
  } else if (currentState === 'STEP_2') {
    Logger.log('STEP 2: データ処理');
    // 次のステップへ状態を更新
    userProperties.setProperty('process_state', 'STEP_3');
  } else if (currentState === 'STEP_3') {
    Logger.log('STEP 3: 結果の通知');
    // 最終ステップが完了したら状態をリセット
    userProperties.deleteProperty('process_state');
  }
}

2. 状態管理の流れ

  1. PropertiesService.getUserProperties()でユーザープロパティを取得。
  2. 現在の状態をprocess_stateとして保存し、デフォルトでSTEP_1からスタート。
  3. 各ステップで状態に応じた処理を実行し、次のステップに進む際にプロパティを更新。
  4. 最終ステップが完了したら、プロパティを削除してリセット。

このトリックを使えば、GASのスクリプトが実行されるたびに続きから作業を進められる。たとえば、定期的なデータ処理や複数段階に分かれたタスクを管理するのに非常に便利だ。


ディープトリック・その3:Webhookから受け取ったデータをチェーン化して処理する

最後に取り上げるのは、Webhookの受信とそれに基づくAPI呼び出しの連鎖だ。外部サービスからリアルタイムに通知を受け取るWebhookを活用し、それに基づいて複数のAPIを呼び出すことで、まるでイベント駆動型システムのような自動化をGASで実現する。

1. Webhookの基本設定

Webhookとは、外部システムが特定のイベントに対して即時に通知を送信するための仕組みだ。たとえば、Slackのメッセージが投稿されたとき、Webhookを介して通知を受け取り、それに応じた処理をGoogleスプレッドシートやGoogle Driveで行うことができる。

まずは、GASをWebアプリとしてデプロイして、外部サービスからの通知を受け取れるように設定する。

  1. スクリプトエディタで「公開」→「ウェブアプリケーションとして導入」からデプロイ。
  2. 誰でもアクセスできるようにアクセス権限を設定する。
  3. デプロイURLをWebhookのエンドポイントとして外部サービスに設定する。

2. Webhookのチェーン化処理

Webhookの通知を受け取った後、それをトリガーとして連続した処理を実行することが可能だ。例えば、Slackのメッセージを受け取ってGoogle Driveに保存し、そのリンクをGoogle Calendarに登録する、といった一連のタスクを実行できる。

function doPost(e) {
  // Webhookからのデータを受け取る
  const params = JSON.parse(e.postData.contents);
  const slackMessage = params.text;

  // Step 1: Google Driveにファイルを作成
  const file = DriveApp.createFile('SlackMessage.txt', slackMessage);
  const fileUrl = file.getUrl();

  // Step 2: Google Calendarにイベントを作成し、ファイルリンクを追加
  const calendar = CalendarApp.getDefaultCalendar();
  calendar.createEvent('Slackメッセージ受信', new Date(), new Date(), {
    description: `ファイルリンク: ${fileUrl

}`
  });

  // Webhookに対して成功メッセージを返す
  return ContentService.createTextOutput('Webhook processed successfully');
}

3. 処理の流れ

  1. Webhook受信:SlackなどからWebhookを介してメッセージが送信されると、doPost関数が呼び出される。
  2. データ処理:受け取ったメッセージをGoogle Driveに保存し、そのファイルリンクを取得。
  3. 連続処理:取得したファイルリンクをもとに、Google Calendarにイベントを作成し、リンクを説明欄に追加。
  4. レスポンス:Webhook送信元に対して処理が成功した旨を通知。

このような流れを構築することで、Slackの通知を受け取ったら自動的にファイルを作成し、カレンダーにイベントを登録するなど、完全なイベント駆動型のワークフローを作成できる。さらに、他のサービス(例えば、GmailやGoogle Sheets)との連携を追加すれば、複雑な処理チェーンも可能だ。


まとめ

今回紹介した3つのディープなトリックにより、GASを使った自動化はさらなる高度なレベルに進化する。非同期処理を活用してAPIの処理速度を最大化し、状態管理で動的なフロー制御を実現し、Webhookを介したリアルタイムかつチェーン化されたタスクの連続処理で、複数のサービスを一体化したようなシステムを作り出そう。

次回は、このチェーン処理をさらに発展させ、完全に動的なリアルタイムシステムの構築に挑戦する。お楽しみに!

コメント

このブログの人気の投稿

桃太郎電鉄ワールド、初の大型アップデート。その名も『ムー大陸浮上!』

GASでスクレイピング 〜天才ア○バ様の教え〜