みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptを使ってメルマガ配信システムを作成しています。
前回の記事でいったん完成しましたね。
めでたし、めでたし。
…しかしながら、Google Apps Script…何も考えずにスプレッドシートの読み書きをガシガシ行うような組み方をすると、めっちゃ処理が遅くなるんです。
それを回避するためには、以下の記事にあるとおり、APIの呼び出し回数を抑える書き方をする必要があるんですね。
ということで、今回は処理速度を速くする方法を活用して、GASによるメルマガ配信スクリプトの高速化を進めていきたいと思います。
おさらい:修正前のスクリプトとその実行速度
おさらいですが、前回作成したメルマガ配信スクリプトはこちらです。
function sendMail(){ const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow();; const DOC_URL = '*****ドキュメントのURL*****'; const doc = DocumentApp.openByUrl(DOC_URL); const docText = doc.getBody().getText(); const subject = 'メルマガ送信テスト'; const options = {name: 'いつも隣にITのお仕事'}; for(let i = 2; i <= lastRow; i++){ const company = sheet.getRange(i, 1).getValue(); const lastName = sheet.getRange(i, 2).getValue(); //姓 const firstName = sheet.getRange(i, 3).getValue(); //名 const recipient = sheet.getRange(i, 4).getValue(); const body = docText .replace('{社名}',company) .replace('{姓}',lastName) .replace('{名}',firstName); GmailApp.sendEmail(recipient, subject, body, options); } }
実行速度を確認する
以前の例では、リストが2件しかなかったのですが、これが99件(見出しを入れて100行)あったとして実行時間を確認してみましょう。
スクリプトの4行目を、以下のように変更。
const lastRow = 100; //sheet.getLastRow();
また、実際にメールが送られちゃうと面倒なので、25行目はコメントアウトしちゃいましょう。
// GmailApp.sendEmail(recipient, subject, body, options);
これで以下のlogTimeを実行をして、その時間を測定してみます。
function logTime() { const label = 'sendMail time' console.time(label); sendMail(); console.timeEnd(label); }
結果はこちら。
2164ミリ秒ですね。
APIの呼び出し回数を減らして高速化する
では、スクリプトを修正して解決していきましょう。
冒頭のスクリプトですが、13行目からのforループは2から100までですから、全部で99回繰り返します。
その内部の処理の15~18行目、ここでgetRangeとgetValuesをそれぞれ4回使っていますので、ここが実行時間としては損してそうですね。
処理速度を改善したメルマガ配信スクリプト
事前にデータを二次元配列として取得して、それについてループをするように変更していきましょう。
スクリプトはこのようになりました。
function sendMail(){ const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = 100; //sheet.getLastRow(); const values = sheet.getRange(1, 1, lastRow, 4).getValues(); const DOC_URL = '*****ドキュメントのURL*****'; const doc = DocumentApp.openByUrl(DOC_URL); const docText = doc.getBody().getText(); const subject = 'メルマガ送信テスト'; const options = {name: 'いつも隣にITのお仕事'}; for(let i = 1; i < lastRow; i++){ const company = values[i][0]; const lastName = values[i][1]; //姓 const firstName = values[i][2]; //名 const recipient = values[i][3]; const body = docText .replace('{社名}',company) .replace('{姓}',lastName) .replace('{名}',firstName); // GmailApp.sendEmail(recipient, subject, body, options); } }
実行速度の前に、sendEmailメソッドやgetLastRowメソッドのコメントアウトを戻して、ちゃんとメールが送信されるかも確認してくださいね。
実行時間の測定
上記スクリプトを実行して、速度を測定してみましょう。
480ミリ秒…!
けっこう速くなりましたね!
まとめ
Google Apps Scriptのメルマガ配信スクリプトの高速化をする方法についてお伝えしました。
APIの呼び出し回数を減らすことを考えるのは、もう必須と言っていいほど効果がありますね。
ぜひ、マスター頂ければと思います!