LoginSignup
3
3
記事投稿キャンペーン 「エンジニア×非エンジニアのコミュニケーション」

【神回】【0からGASを学ぶ】GASの制限を超える小技集 -その1-

Last updated at Posted at 2023-11-06

はじめに

本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。

シリーズの対象者

  • そもそもGASってなんだかわからない
  • GASを学びたいけど何から始めればいいかわからない方
  • GASはわかり始めたけど、もっと活用ができないかと模索している方
  • とにかくGoogleが好き! という方

前回記事

小技集

では早速始めていきましょう。【0からGASを学ぶ】シリーズの第9回は「GASの制限を超える小技集」です。その1では、これまで紹介してきたGASの中で「制限があるので注意!」とお伝えしたいくつかを突破します。

今回やること

  1. GASの自動メール送信回数を突破!
  2. トリガーを指定した任意の時間に実行!

今回はスタンドアロン型でGASを記述していきます。こちらを参考にGASエディタを起動してください。では、どんどんいきますよ、ついてきてください。

GASの自動メール送信回数を突破!

まずは事象を確認

第3回:GASの制限回数を意識しながら各種サービスにアクセスしてみようにおいて、GASのGmailApp(またはMailApp)を通したメール送信には制限回数があるとお伝えしました。これに偽りはなく、以下のプログラムでもわかる通り、メール送信するたびに残回数は減っていきます。

Qiita009.gs
function Qiita009_SendEmail() {
  console.log(MailApp.getRemainingDailyQuota());
  // MailApp.getRemainingDailyQuota()は残送信回数を確認する関数
  for (let mIdx=0; mIdx<10; mIdx++) {
    GmailApp.sendEmail('*******@gmail.com', 'Gメール送信回数確認','');
    console.log(MailApp.getRemainingDailyQuota());
  }
}
実行結果
11:24:16	お知らせ	実行開始
11:24:17	情報	100
11:24:18	情報	99
11:24:19	情報	98
11:24:20	情報	97
11:24:21	情報	96
11:24:24	情報	95
11:24:25	情報	94
11:24:25	情報	93
11:24:26	情報	92
11:24:29	情報	91
11:24:30	情報	90
11:24:29	お知らせ	実行完了

そして、このメール送信による制限回数は、たとえ有償のWorkspaceユーザでも撤廃されることはありません

  • 無償ユーザ:100名/日
  • 有償ユーザ:1,500名/日

よし、突破するぞ!!!!

では突破していきましょう。この制限事項のポイントは、GmailAppを通したメール送信という点です。つまり、GmailAppを用いて直接sendMailを実行することをカウントしているわけです。
とんちのように聞こえますが、ここがポイントです。そのためメール送信箇所を以下のように変えましょう。

  • 変更前
    1. メールを送信する
  • 変更後
    1. メールを作成して、下書きに保存する
    2. 下書きの送信依頼をする
Qiita009.gs
function Qiita009_SendEmailEx() {
  console.log(MailApp.getRemainingDailyQuota());
  // MailApp.getRemainingDailyQuota()は残送信回数を確認する関数
  for (let mIdx=0; mIdx<10; mIdx++) {
    sendEmailEx('*******@gmail.com', 'Gメール送信回数確認','');
    console.log(MailApp.getRemainingDailyQuota());
  }
}

function sendEmailEx(_recipient, _subject, _body, _option) {
  // 引数の内容でメールを下書き保存する
  const mailDraft = GmailApp.createDraft(_recipient, _subject, _body, _option);
  // 下書き保存したメールIDから下書きを取得し、メール送信を依頼する
  GmailApp.getDraft(mailDraft.getId()).send();
}
実行結果
11:26:12	お知らせ	実行開始
11:26:13	情報	90
11:26:14	情報	90
11:26:16	情報	90
11:26:17	情報	90
11:26:18	情報	90
11:26:19	情報	90
11:26:21	情報	90
11:26:22	情報	90
11:26:24	情報	90
11:26:25	情報	90
11:26:26	情報	90
11:26:26	お知らせ	実行完了

いかがでしょうか。今回はsendEmailの拡張メソッドとして、sendEmailExを作成し、下書き保存下書きの送信依頼を記述しました。これを使うことでGASの実行制限を突破できます!!!

ただし!!!

GASの実行制限に関しては突破できますが、そもそものGmailの制限も併せてご確認ください。こればっかりはどうしようもないので、GASを実運用に適用する場合は、必ずご一読を

トリガーを指定した任意の時間に実行!

まずは事象を確認

第8回:【0からGASを学ぶ】GASを用いてスプレッドシートで遊んでみよう -その4-において、GASのトリガー実行では「日付ベースのタイマー」を設定できるか、実行時刻に幅がある(0:00~1:00といった具合) ことをお伝えしました。もちろんこれでも許容範囲な場合もあるかもしれませんが、可能な限り、想定通りの時刻に実行したいですよね。

特定日時の設定もある

GASのトリガー実行には、以下画像で示す通り、「特定の日時」とすることで、作成者の意図した時間に実行することは可能です。

が、見てわかる通り、特定の日時を一度だけです。
毎日8:30に実行されるようにしたいならば、その数だけトリガーを作成する必要があります。しかし、ここでもGASの制限事項がついてまわります。

  • トリガーの作成個数:ユーザーあたり 20 個/スクリプト

そのため、毎日実行されるようにしたくても、20個分作って、日々メンテをする必要があります。こんなのやってられないですよね。

よし、突破するぞ!!!!

では、どうするか。これの答えは非常に簡単です。
トリガーにより実行されるメソッドの中で、次のトリガーを作ればいいわけです。
これまたとんちのように聞こえますが、ここがポイントです。ではプログラムで書いていきましょう。

Qiita009.gs
function Qiita009_Trigger() {
  // トリガーに設定されている自分自身を削除する
  ScriptApp.getProjectTriggers().forEach(function(trigger){
    // トリガー名が一致するときのみ削除
    if(trigger.getHandlerFunction() == "Qiita009_Trigger"){
      ScriptApp.deleteTrigger(trigger);
    }
  });
  // 5分後に自分自身のトリガーをセットする
  let setTime = new Date();
  setTime.setMinutes(setTime.getMinutes()+5);
  ScriptApp.newTrigger('Qiita009_Trigger').timeBased().at(setTime).create();

  // 処理を実行する
  Qiita009_SendMailTrigger();
}

function Qiita009_SendMailTrigger() {
  sendEmailEx(
    '*******@gmail.com'
    , 'トリガーによるメール送信'
    , Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss')
  );
}

上述のプログラムのQiita009_Triggerを実行すると、自分自身のnextトリガーが作成されたうえで、Qiita009_SendMailTriggerメソッドが実行されます。

これにより、次は5分後自分自身(Qiita009_Trigger)が呼び出され、またその5分後に自分自身の呼び出しトリガーを作成するというのを繰り返します。
つまり、このやり方を応用すればsetTime.setMinutes(setTime.getMinutes()+5);の箇所を書き換えることで、setTime.setDate(setTime.getDate()+1);とすれば日時で、setTime.setHours(setTime.getHours()+1);とすれば毎時で処理を実行することができます。
ぜひ、ご自身の処理したいサイクルで設定を記述してみてください。

私がよく使うのは、0:00の日時処理で、

  setTime.setDate(setTime.getDate()+1)
  setTime.setHours(0);
  setTime.setMinutes(0);
  setTime.setSeconds(0);

で設定しています。

と、記事を書いてる間にも先ほどのトリガーが実行され続けています。

おわりに

お疲れ様でした。
第9回は「GASの制限を超える小技集」その1ということで、これまでお伝えしたGASの基本的(すこし実践的)な使い方の中で発生していた実行制限を突破する方法をいくつか紹介しました。GASは非常に便利で強力なツールです。しかし、運用を開始しようとするとその制限に阻まれることがあります。そんなときは、この記事を読んで制限突破を試みてください。今後も、たまにこういった小技も盛り込みながらGASの楽しさをお伝えしていきます。
記事を読んで、「良いな」や「今後に期待できる!」と感じて頂けたらいいねフォローコメントいただけると幸いです。それではまた次回をお楽しみに!

ブログでより詳しく解説しています!

以下画像をクリックしてブログにアクセス!!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3