はじめに
Google Apps Script (GAS)は、Google Workspaceアプリケーションのカスタマイズと拡張を容易にするための強力なツールです。特に、GoogleスプレッドシートとGmailを統合して、業務効率を向上させるためのさまざまな自動化タスクを実行することができます。本記事では、スプレッドシートを利用して大量のメール下書きを作成するGAS関数の作成方法と、その際に直面する可能性のある制限について説明します。さらに、その制限を回避するための解決策も提案します。スプレッドシートを利用したメール下書き作成のコード
以下は、スプレッドシートのデータをもとにGmailのメール下書きを作成するGAS関数の一例です。function createDraft() {
const values = SpreadsheetApp.getActiveSheet();
const to = values.getRange(2, 2).getValue(); //宛先
const subject = values.getRange(5, 2).getValue(); //件名
let body = ''; //本文
body += values.getRange(6, 2).getValue() + '\n';
body += values.getRange(7, 2).getValue() + '\n';
const options = {"cc":values.getRange(3, 2).getValue(),"bcc":values.getRange(4, 2).getValue()}; //Cc,Bcc
GmailApp.createDraft(to, subject, body, options);
}
制限の背景
Gmailにはスパム防止やリソースの最適化の観点から、送信や下書きの作成に対していくつかの制限があります。その一つが、1つのメールに対して宛先(To、Cc、Bccの合計)が50件を超えると、以下のようなエラーが発生するというものです。この制限により、大量のメールを一度に処理することが難しくなります。TypeError: MailApp.createDraft is not a function
解決策
この制限を回避するためには、以下のようなアプローチが考えられます。- バッチ処理: 宛先を複数のバッチに分けて、それぞれに対して個別に下書きを作成します。例えば、宛先が100件の場合、50件ずつ2回に分けて下書きを作成します。
function createDraftsInBatches() { const values = SpreadsheetApp.getActiveSheet(); const subject = values.getRange(5, 2).getValue(); let body = ''; body += values.getRange(6, 2).getValue() + '\n'; body += values.getRange(7, 2).getValue() + '\n'; const cc = values.getRange(3, 2).getValue(); const bcc = values.getRange(4, 2).getValue(); const recipients = values.getRange(2, 2).getValue().split(','); //宛先をカンマで分割 const batchSize = 50; for (let i = 0; i < recipients.length; i += batchSize) { const batchRecipients = recipients.slice(i, i + batchSize).join(','); const options = {"cc": cc, "bcc": bcc}; GmailApp.createDraft(batchRecipients, subject, body, options); } }
- Googleグループの活用: 宛先が多い場合、Googleグループを作成して一つのメールアドレスでまとめることも有効です。これにより、Gmailの制限を回避しつつ、一斉にメールを送信することができます。
- 複数の下書き作成: バッチ処理と似ていますが、宛先ごとに個別の下書きを作成する方法です。これにより、エラーを回避しつつ、個々の受信者に対してメールを準備することができます。
function createIndividualDrafts() { const values = SpreadsheetApp.getActiveSheet(); const subject = values.getRange(5, 2).getValue(); let body = ''; body += values.getRange(6, 2).getValue() + '\n'; body += values.getRange(7, 2).getValue() + '\n'; const cc = values.getRange(3, 2).getValue(); const bcc = values.getRange(4, 2).getValue(); const recipients = values.getRange(2, 2).getValue().split(','); //宛先をカンマで分割 recipients.forEach(recipient => { const options = {"cc": cc, "bcc": bcc}; GmailApp.createDraft(recipient, subject, body, options); }); }