GASでの高度な自動化トリック 〜自動化の裏側に潜む罠を乗り越える方法(探偵編その2)〜
今回は「高度な自動化のトリック」について、掘り下げてみる。スクリプトがただ動くだけじゃ満足できない連中のために、もう少し高度な自動化手法を披露してやろう。データの正規化や整理なんて序章に過ぎない。俺たち探偵は、問題が発生したときにこそ腕が試される。自動化の罠にハマらないための秘訣ってやつだ。
トリック1:複雑なフローを自動化する
データ整理が一段落した後、クライアントはきっと次の無理難題を押し付けてくる。例えば、複数のシートやファイルに分散しているデータを一括で集めて、集約してくれってな。こんなときに役に立つのが**「トリガーチェーン」**という高度なテクニックだ。
トリガーチェーンとは?
複数のスクリプトやフローを連携させるためのテクニックだ。一つのスクリプトが完了したら、次のスクリプトを実行するようにトリガーを設定しておく。時間トリガーだけじゃなく、カスタムトリガーも使って、まるでパズルのピースをはめるように自動化を仕込む。
例:データ集約のフロー
- シートAからデータを抽出。
- シートBからもデータを引っ張り出す。
- データを集約して、新しいシートCに書き込む。
こんなフローを実現するためのスクリプトは、こんな感じになる。
function extractDataFromSheetA() {
const sheetA = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SheetA');
const dataA = sheetA.getDataRange().getValues();
// ここでデータ処理を行う
// ...
// 次のステップに進むためにカスタムトリガーを設定
ScriptApp.newTrigger('extractDataFromSheetB')
.timeBased()
.after(1000) // 1秒後に次のスクリプトを実行
.create();
}
function extractDataFromSheetB() {
const sheetB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SheetB');
const dataB = sheetB.getDataRange().getValues();
// ここでデータ処理を行う
// ...
// データを集約してSheetCに書き込む
const sheetC = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SheetC');
const combinedData = combineData(); // データを組み合わせる関数
sheetC.getRange(1, 1, combinedData.length, combinedData[0].length).setValues(combinedData);
}
ポイント:
-
ScriptApp.newTrigger()
を使って、スクリプトが完了したら次のステップを実行するように設定。 - タイミングをずらして実行することで、複数のプロセスが衝突しないようにする。
- しかし、.after(milliseconds)で指定する時間は、絶対にその時間以前には指定スクリプトを実行しない、というminimum delayであることに注意が必要だ。1000ミリ秒を指定したとしても、実際に実行されるのは1分後かもしれない。それでも文句を言うことは出来ない。それが仕様というものだ。
トリック2:Google Driveとの連携でデータ管理を極める
スプレッドシートだけじゃ物足りない?なら、次のステップはGoogle Driveとスクリプトを連携させて、ファイル管理も自動化してしまう手だ。
たとえば、Driveに保存されたExcelファイルやPDFファイルを自動でスプレッドシートに変換して、データを取り込む。しかも、これを定期的にやらせるトリガー付きの自動化だ。
function importFilesFromDrive() {
const folder = DriveApp.getFolderById('FOLDER_ID');
const files = folder.getFilesByType(MimeType.MICROSOFT_EXCEL);
while (files.hasNext()) {
const file = files.next();
const spreadsheet = SpreadsheetApp.openById(convertExcelToSheet(file.getId()));
// データ処理を行う
processSpreadsheetData(spreadsheet);
}
}
function convertExcelToSheet(fileId) {
const file = DriveApp.getFileById(fileId);
const blob = file.getBlob();
const convertedSpreadsheet = Drive.Files.insert({
title: file.getName(),
mimeType: MimeType.GOOGLE_SHEETS
}, blob);
return convertedSpreadsheet.id;
}
このスクリプトは、Google Drive内のExcelファイルを定期的にスキャンして、スプレッドシートに変換する。クライアントが大量にファイルを送りつけてきても、手動で変換する必要はない。スクリプトがすべて自動でやってくれる。
トリック3:通知の自動化
何が自動で処理されたか?その結果をクライアントに逐一報告しなければならない。まぁ、通知を手作業でやるわけにもいかないだろう。だから、スクリプトが完了したら、メールやSlackに通知を飛ばすようにしておく。
GASを使って、処理の完了を自動通知するスクリプトだ。クライアントのSlackチャンネルにメッセージを飛ばすこともできるし、Gmailで報告することも可能だ。
function sendCompletionNotification() {
const message = 'データ処理が完了しました。問題があればご連絡ください。';
// Slackに通知を送る
UrlFetchApp.fetch('https://hooks.slack.com/services/YOUR_WEBHOOK_URL', {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({
text: message
})
});
// または、Gmailで通知を送る
GmailApp.sendEmail('client@example.com', 'データ処理完了', message);
}
通知機能を加えることで、処理が完了したときにクライアントを安心させてやることができる。自動化されたプロセスに自信を持たせるための一手だ。
トリック4:エラー処理を強化する
自動化ってのは失敗がつきものだ。特に、スクリプトが動いている間に予期しないエラーが発生した場合、放っておくとクライアントからの苦情が山ほど届く羽目になる。だからこそ、エラー処理も自動化して、何が起こったか即座に対応する体制を整えておくのがベストだ。
function runWithErrorHandling() {
try {
normalizeData(); // メイン処理を実行
} catch (e) {
Logger.log('エラーが発生しました: ' + e.message);
GmailApp.sendEmail('admin@example.com', 'スクリプトエラー', 'エラー内容: ' + e.message);
}
}
スクリプトにエラー処理を仕込んでおけば、何か問題が起こったときに自動でエラーメッセージを管理者に送信する。これでクライアントに説明しやすくなるし、事前に対応策を取ることができる。
まとめ
高度な自動化の世界は、スクリプトをただ動かすだけじゃ終わらない。複数のプロセスを連携させ、Driveや他のツールと統合し、通知機能まで仕込んでおけば、クライアントの要求にもすべて応えられる。しかも、エラーが起きたときにも対応策を練っておくのが、プロフェッショナルな自動化だ。だが、気を抜いたら最後、自動化の罠にハマってしまう。常に先を見据えて、スクリプトに命を吹き込むことが大事だ。
次回はさらにディープなトリックを紹介するぜ。自動化の真髄を知りたければ、もう少し付き合ってもらおうか。
コメント
コメントを投稿