GASでさらに極める自動化:外部APIとリアルタイム連携

今回のテーマは「さらにディープなトリック」。これまでのトリガーや自動化、エラー処理なんてのは序章に過ぎない。今度は自動化を究極まで突き詰めて、GASの限界を越えてやろうじゃないか。API連携や外部データの取込み、リアルタイムな自動化を駆使して、より複雑な処理をいかに軽々とこなすか。いくつかの例をお披露目しよう。


ディープトリック1:外部APIとのシームレスな連携

外部APIを使ってリアルタイムでデータを取得し、スプレッドシートに反映させるトリックを紹介する。今回使うのは、OpenWeather API という天気情報を提供するAPIだ。これを用いて、特定の都市の天気情報をスプレッドシートに自動で反映させる。

まずは、OpenWeather APIにサインアップしてAPIキーを取得しよう(こちらから)。APIキーは後でスクリプト内で使う。

function fetchWeatherData() {
  const apiKey = 'YOUR_API_KEY';  // 取得したAPIキー
  const city = 'Tokyo';  // 対象都市
  const apiUrl = `http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;
  
  const response = UrlFetchApp.fetch(apiUrl);
  const jsonData = JSON.parse(response.getContentText());

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('WeatherData');
  sheet.getRange('A1').setValue(`Weather in ${city}`);
  sheet.getRange('A2').setValue(`Temperature: ${jsonData.main.temp}°C`);
  sheet.getRange('A3').setValue(`Humidity: ${jsonData.main.humidity}%`);
}

このコードでは、OpenWeather API から天気データを取得し、スプレッドシートに反映している。このスクリプトを時間トリガーで設定すれば、例えば毎朝自動でその日の天気情報が更新される。APIのデータ取得頻度を上げることで、常にリアルタイムのデータがスプレッドシートに反映される仕組みだ。


ディープトリック2:カスタムWebフックでリアルタイム通知

APIからのデータ取得だけでは満足できない場合、次はWebフックを使って、外部サービスからリアルタイムで通知を受け取るトリックを紹介する。例えば、監視システムのアラートやSlackのチャット通知を受けて、Gmailを自動送信したり、スプレッドシートに追記するような処理が可能だ。

Webフック受信スクリプト

function doPost(e) {
  const params = JSON.parse(e.postData.contents);
  
  if (params.eventType === 'ALERT') {
    GmailApp.sendEmail('admin@example.com', 'リアルタイムアラート', 'アラート内容: ' + params.message);
  } else if (params.eventType === 'DATA_UPDATE') {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DataUpdates');
    sheet.appendRow([params.timestamp, params.data]);
  }
  
  return ContentService.createTextOutput('Webhook received');
}

このスクリプトでは、外部サービスからPOSTリクエストを受け取り、そのデータに応じてGmailを送信したり、スプレッドシートにデータを記録する。上記のスクリプトをWebアプリとしてデプロイしたURLを外部サービスのWebフック設定に登録しておけば、通知が飛んでくるたびに自動で処理を実行することができる。

なお、Webフックを受け取るためにはGASスクリプトをWebアプリとして公開する必要がある。以下の手順で設定する。

Webアプリの設定方法

  1. GASのエディタからスクリプトを開き、公開 > ウェブアプリケーションとして導入を選択。
  2. 新しいプロジェクトバージョンを作成し、アクセス権限を「全員(匿名ユーザーを含む)」に設定する。
  3. デプロイをクリックし、URLが表示されるのでこれをWebフックのエンドポイントとして使用する。

ディープトリック3:スプレッドシート間の双方向データ同期

大規模なプロジェクトでは、複数のチームが異なるスプレッドシートで作業していることが多い。ここで紹介するのは、スプレッドシート間でのデータ同期だ。ただし、注意点がある。同期が双方向である場合、無限ループに陥る危険性があるため、ここでは一方向の同期を行う。

一方向とはつまり、データが片方のスプレッドシートから他方へコピーされるが、その逆はないということだ。こうすることで、同期の際にデータが上書きされ続ける問題を回避できる。双方向同期を実現したい場合は、データの差分を正確に追跡する高度なロジックが必要になる。

スプレッドシートの同期スクリプト

function syncSheets() {
  const sourceSheet = SpreadsheetApp.openById('SOURCE_SHEET_ID').getSheetByName('Data');
  const targetSheet = SpreadsheetApp.openById('TARGET_SHEET_ID').getSheetByName('Data');
  
  const sourceData = sourceSheet.getDataRange().getValues();
  const targetData = targetSheet.getDataRange().getValues();

  // データが異なる場合のみ同期
  if (JSON.stringify(sourceData) !== JSON.stringify(targetData)) {
    targetSheet.getRange(1, 1, sourceData.length, sourceData[0].length).setValues(sourceData);
  }
}

このスクリプトは、SOURCE_SHEET_ID で指定したスプレッドシートからデータを取得し、TARGET_SHEET_ID で指定したスプレッドシートに反映させる。時間トリガーを使ってこのスクリプトを定期的に実行すれば、常に最新のデータを維持できる。ただし、あくまで片方向の同期であることに注意しよう。双方向での同期を行うと、データの競合が発生するリスクが高まるため、慎重な設計が求められる。


ディープトリック4:カスタム関数でスプレッドシートを超える

スプレッドシートに埋め込む関数だけでは限界がある。そこで、GASのカスタム関数を駆使して、もっと複雑な計算やデータ処理を可能にする。例えば、APIからデータを引っ張ってきて、シート内の特定セルでリアルタイムに表示させる、なんてことも簡単にできる。

function CUSTOM_API_CALL() {
  const response = UrlFetchApp.fetch('https://api.example.com/data');
  const data = JSON.parse(response.getContentText());

  return data.value;  // スプレッドシート内で表示される値
}

この関数をシート内で使えば、=CUSTOM_API_CALL()という数式でリアルタイムのAPIデータをスプレッドシート内に表示させることができる。クライアントに提供するのは、静的なデータじゃない。常に動き続ける、リアルタイムのデータだ。


まとめ

自動化の世界に足を踏み入れたなら、API連携、Webフック、スプレッドシート間の同期といった高度な技術を駆使し、さらなる効率化を図ることができる。これらの技術を組み合わせることで、もはや手動でデータを更新したり、システムからの通知を手作業で処理する必要はない。今後の自動化の進化を楽しみにしてほしい。

次回は、もっとディープな自動化のトリックに挑む。APIのエンドポイントを超えたさらなる自動化の道を一緒に探っていこう。

コメント

このブログの人気の投稿

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

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

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