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で非同期処理を実装する際は、Promiseとasync/awaitでコードを整理し、UrlFetchApp.fetchAllで並列リクエストを活用することで、待機時間を最小化し、高速化を実現できます。
コメント
コメントを投稿