スキップしてメイン コンテンツに移動

fetchAllでGAS並列化

fetchAllでGAS並列化

GAS応用で非同期処理を実現する

Google Apps Script(GAS)は、デフォルトで同期的に実行されるため、長時間かかる処理や外部API呼び出しを行う際に待機時間が発生します。そこで、非同期処理を導入することで、待機時間を最小化し、ユーザー体験を向上させることが可能です。GASでは、UrlFetchApp.fetchAllを利用して複数のリクエストを同時に送信し、並列リクエストを実現します。これにより、従来の同期呼び出しに比べて数倍の高速化が期待できます。

非同期処理を制御するために、Promiseやasync/awaitを組み合わせると、コードの可読性と保守性が大幅に向上します。以下では、実際にGASで非同期処理を実装する手順を紹介します。

Promiseとasync/awaitでコードをシンプルに

Promiseは、非同期処理の結果を表すオブジェクトです。GASでは、UrlFetchApp.fetchAllが返す配列をPromiseに変換し、async/awaitで待機することで、同期的な書き方に近いコードを実現できます。

async function fetchData(urls) {
  const fetchPromises = urls.map(url => fetch(url));
  const responses = await Promise.all(fetchPromises);
  return responses.map(res => res.getContentText());
}

上記の例では、fetch関数をPromise化し、Promise.allで全てのリクエストが完了するまで待機します。これにより、待機時間を最小限に抑えつつ、同期的に結果を取得できます。

さらに、エラーハンドリングも簡潔に行えます。try/catchブロックで全体を囲むことで、どのリクエストが失敗したかを一括で検知できます。

UrlFetchApp.fetchAllで並列リクエストを高速化

GASのUrlFetchApp.fetchAllは、複数のURLを同時にリクエストできる便利なメソッドです。以下のように使用します。

function parallelFetch() {
  const urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
  ];
  const options = { muteHttpExceptions: true };
  const responses = UrlFetchApp.fetchAll(urls.map(url => ({ url, options })));
  responses.forEach(res => Logger.log(res.getResponseCode()));
}

このメソッドは、内部で非同期的にリクエストを送信し、全てのレスポンスが揃うまで待機します。従来のUrlFetchApp.fetchをループで呼び出すよりも、ネットワークレイテンシを大幅に削減できます。

高速化のポイントは、並列リクエスト待機制御です。fetchAllは自動的に並列化を行うため、開発者は待機処理に集中できます。さらに、muteHttpExceptionsオプションを設定することで、個別の失敗を許容しつつ、全体の処理を継続できます。

まとめると、GASで非同期処理を実装する際は、Promiseasync/awaitでコードを整理し、UrlFetchApp.fetchAllで並列リクエストを活用することで、待機時間を最小化し、高速化を実現できます。

この記事はAIによって作成されました。

コメント