Google Apps Scriptのメルマガ配信スクリプトを高速化する

speeding-up

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptを使ってメルマガ配信システムを作成しています。

前回の記事でいったん完成しましたね。

たったの28行!Google Apps Scriptで超簡易メルマガ配信システム
Google Apps Scriptで超簡易メルマガ配信システムを作成しています。今回はいよいよスプレッドシートのアドレス宛にドキュメントの本文をGmailで送信する処理を追加していきます。

めでたし、めでたし。

…しかしながら、Google Apps Script…何も考えずにスプレッドシートの読み書きをガシガシ行うような組み方をすると、めっちゃ処理が遅くなるんです。

それを回避するためには、以下の記事にあるとおり、APIの呼び出し回数を抑える書き方をする必要があるんですね。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

ということで、今回は処理速度を速くする方法を活用して、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);
}

結果はこちら。

高速化する前のGoogle Apps Scriptの実行速度

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メソッドのコメントアウトを戻して、ちゃんとメールが送信されるかも確認してくださいね。

実行時間の測定

上記スクリプトを実行して、速度を測定してみましょう。

高速化したGoogle Apps Scriptの実行速度

480ミリ秒…!

けっこう速くなりましたね!

まとめ

Google Apps Scriptのメルマガ配信スクリプトの高速化をする方法についてお伝えしました。

APIの呼び出し回数を減らすことを考えるのは、もう必須と言っていいほど効果がありますね。

ぜひ、マスター頂ければと思います!

連載目次:Google Apps Scriptでメルマガシステムを作っちゃおう!

Google Apps ScriptでGmail、スプレッドシート、ドキュメントを連携させて操作することでメルマガシステムが簡単に実現できます。思ったより2割くらい簡単にできますよ。ちなみに無料です…さすがGoogle。
  1. 初心者でも簡単!Google Apps ScriptでGmailを操作してメールを送る方法
  2. 初心者でも簡単!Google Apps Scriptでドキュメントを取得して表示する方法
  3. Google Apps Scriptでスプレッドシートのリストをもとに宛名を差し込んだメール本文を作る
  4. たったの28行!Google Apps Scriptで超簡易メルマガ配信システム
  5. Google Apps Scriptのメルマガ配信リスト自動更新スクリプトを高速化する
タイトルとURLをコピーしました