4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

【0からGASを学ぶ】GASの制限回数を意識しながら各種サービスにアクセスしてみよう

Last updated at Posted at 2023-10-23

はじめに

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

シリーズの対象者

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

前回記事

GASの制限回数を意識しながらサービスを操作する

では早速始めていきましょう。【0からGASを学ぶ】シリーズの第3回は「GASの制限回数を意識しながら各種サービスにアクセスしてみよう」です。

GASからアクセス

前回はGASからGoogleの代表的なサービスであるGoogleスプレッドシートGoogleドキュメントGoogleスライドGoogleフォームそれぞれにアクセスし、簡単な操作までやりました。今回はそれらに加えて、GoogleカレンダーGoogleドライブGmailにもアクセスしてみましょう。さらに前々回にちらっと話した無償ゆえの制約事項にも触れていきましょう。

事前準備

今回は、Googleドライブ上のファイル移動を行っていきますので、試しに以下のように移動前フォルダ「test001」と移動後フォルダ「test002」を作ってください。

「Qiita003」は本記事で使用するGASファイルを同階層にいれているだけなので、この構成である必要はありません。

フォルダIDを取得

Googleドライブ上のフォルダにも、前回と同様に一意なID(文字、数字、ハイフン、アンダースコアから成る一意の値)が割り振られています。この一意のIDはフォルダにアクセスした際のURLから確認できますので、それを取得(コピー) しておいてください。

※この例でいうと、私が事前準備で作成した「test001」フォルダのIDは四角で囲った1CpGZj_aGoWFBb-lRbw0rjmwjN59PxTYUとなります。

GASエディタを開く

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

Googleカレンダー編

Calendar.gs
function Qiita003_Calendar() {
  // カレンダークラスを用いて、IDを指定してGoogleカレンダーにアクセスする
  let wCalendar = CalendarApp.getCalendarById('***************@gmail.com');

  // 試しに登録するイベントの日時を作成する
  let wStartDate = new Date(2023, 9, 23, 8, 30, 0); 
  // この場合は2023年10月23日の8時30分となる
  // Dateクラスは月だけは0始まりなので注意が必要となるため、文字列での指定でも可能
  // let wStartDate = new Date('2023/10/23 8:30:00');

  let wEndDate = new Date(2023, 9, 23, 18, 0, 0)

  // 上記の開始・終了日時を用いて、カレンダーに登録する
  wCalendar.createEvent('Qiita003_カレンダー登録テスト01', wStartDate, wEndDate);
  // 終日予定の場合は、開始日時(正確には開始日)のみで登録ができる
  wCalendar.createAllDayEvent('Qiita003_カレンダー登録テスト02',wStartDate);
}

上記のプログラムを実行すると、指定したカレンダーにプログラム内で登録した予定が追加されています。

GoogleカレンダーのカレンダーIDの調べ方は以下を参考にしてください。ただし、自身のGoogleカレンダーにアクセスするだけならば、IDはアカウント名(Gmailアドレス)と同一なので、調べるまでもありません。

手順 イメージ
1 Googleカレンダーへアクセスします。
2 左カラムの「マイカレンダー」から「カレンダーID」を確認したいカレンダーにマウスオーバーすると、「︙」が表示されるためクリックします。
3 「設定と共有」をクリックすると選択したカレンダーの設定ページに遷移します。
4 ページ下部にて「カレンダーID」を確認できます。

Googleドライブ編

私の場合は、事前準備で作成した2つのフォルダに対するIDは

  • test001:1CpGZj_aGoWFBb-lRbw0rjmwjN59PxTYU
  • test002:1ITFz8yhg4tBpFNRo-KidWRNtotb6oKRO

となっております。
まずは「test001」に新規でスプレッドシートを作成してみましょう。といっても、フォルダ指定で新規作成するのではなく新規作成後にフォルダを指定して移動させるのが、GASの定石となります。

Drive.gs
function Qiita003_DriveTest001() {
  // ドライブクラスを用いて、IDを指定してドライブにアクセスする(test001)
  let wDrive = DriveApp.getFolderById('1CpGZj_aGoWFBb-lRbw0rjmwjN59PxTYU');

  // スプレッドシートを新規に作成する(マイドライブのルートフォルダに作成)
  let wSpread = SpreadsheetApp.create('Qiita003新規作成')
  // スプレッドシートのIDからドライブクラスで扱えるようファイルオブジェクトを取得する
  let wSpreadFile = DriveApp.getFileById(wSpread.getId());

  // 作成したスプレッドシートをtest001フォルダに移動する
  wSpreadFile.moveTo(wDrive);
}

上記のプログラムを実行すると、「test001」フォルダ内にQiita003新規作成というスプレッドシートが作成されます。

次にこのファイルを「test002」フォルダに移動させます。すでに上記プログラムでフォルダ移動までは実施済みなので、フォルダ内のファイルを取得して、移動するというのをやってみましょう。

Drive.gs
function Qiita003_DriveTest002() {
  // ドライブクラスを用いて、IDを指定してドライブにアクセスする(test001, 002)
  let wDrive001 = DriveApp.getFolderById('1CpGZj_aGoWFBb-lRbw0rjmwjN59PxTYU');
  let wDrive002 = DriveApp.getFolderById('1ITFz8yhg4tBpFNRo-KidWRNtotb6oKRO');

  // test002フォルダ内の全ファイルを取得する
  let wFiles = wDrive001.getFiles();
  while (wFiles.hasNext()) {
    // ファイルリスト内のファイルを1件ずつ取得する
    let wFile = wFiles.next();
    // ファイル名が'Qiita003新規作成'の場合はtest002フォルダに移動する
    if (wFile.getName()=='Qiita003新規作成') {
      DriveApp.getFileById(wFile.getId()).moveTo(wDrive002)
    }
  }
}

上記のプログラムを実行すると、「test001」フォルダ内にあったQiita003新規作成というスプレッドシートが「test002」フォルダに移動します。

ドライブの操作は今回ご紹介したDriveAppだけでなく、拡張ドライブサービス(Drive API)を用いることで、より高度なことが可能になります。それはまた次回以降に!

Gmail編

Gmail.gs
function Qiita003_Gmail() {
  let address = '***********@gmail.com'
      , subject = 'Qiita003'
      , body = `ここには本文を記述します`
      , options = {'bcc':'***********@gmail.com, ***********@gmail.com'};
  // GmailAppクラスを用いて、メールを送信する
  GmailApp.sendEmail(address, subject, body, options);

  // あえてMailAppクラスを用いて、メールを送信する
  MailApp.sendEmail(address, subject, body);
}

上記のプログラムを実行すると、addressに指定したメールアドレス宛にGASを実行しているアカウントからメールが送信されます。
あえて、GmailAppとMailAppをどちらも記載して、2通のメールを送信しています。メールの送信に関して2つに違いはありません。ただし、許容される権限範囲が異なります。この例を実行すると、

といった画面が表示されます。このうち上側がGmailApp下側がMailAppに関するアクセス権限となります。
つまり、GmailAppではGmailに関するあらゆることがGASから可能であり、MailAppでは単にメールを送信することだけが可能です。

メール送信しかしないのであれば、MailAppを推奨するようなページもありますが、本シリーズではGmailAppを推奨します。明確な理由がありますが、それは次回以降のお楽しみにしましょう!

各クラスのリファレンス

今回アクセスしたGoogleカレンダーGoogleドライブGmailについて、簡単な操作方法を示しました。次回以降では各クラスの詳細な活用方法をどんどん記載していきますが、少しでも予習しておきたい方は以下から各クラスのリファレンスを学んでみてください。

CalendarApp

DriveApp

GmailApp

MailApp(念のため)

前回同様安心してください。こーゆーリファレンスが苦手な人でも本シリーズを読み続けていただければ、必ずGASマスターに近づけます

制限回数について

さて、ここまで前回も通じて、GoogleスプレッドシートGoogleドキュメントGoogleスライドGoogleフォームGoogleカレンダーGoogleドライブGmailと様々なサービスにアクセスしてきました。GASは非常に簡単に使えて、無償で様々なことができる可能性を感じていただけているかと思います。
そんな希望に満ち溢れているところを止めるようで申し訳ございませんが、ここでこれまで何度かお伝えしていた無償ゆえの制約事項について触れていきます。

無償ゆえの制限事項と述べていますが、有料のGoogle Workspaceを契約したとしても制限事項が撤廃されるわけではありません。一部が緩和されるのみで、無償で使えるGASには常に制限事項がつきまとうことになります。

代表的な制限事項

制限事項 無償アカウント Google Workspace
スクリプトの実行時間 6 分まで / 実行 6 分まで / 実行
トリガーの合計実行時間 90 分まで / 日 6 時間まで / 日
プロパティの読み取り/書き込み 50,000 回 / 日 500,000 回 / 日
メール送信者数 100 名 / 日 1,500 名 / 日
URL Fetchのコール回数 20,000 回 / 日 100,000 回 / 日

上記以外にも多々ありますが、割と意識しなければならない代表例として5点を挙げました。それ以外は以下を参照してください。

実行制限とは例えば?

スクリプトの実行時間

実行時間の確認.gs
function Qiita003_ScriptRuntime() {
  while(true) {
    console.log(Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd HH:mm:ss'));
    Utilities.sleep(10000); // 10秒スリープさせる
  }
}
実行結果
13:53:59	お知らせ	実行開始
13:53:59	情報	2023-10-23 13:53:59
13:54:09	情報	2023-10-23 13:54:09

13:59:39	情報	2023-10-23 13:59:39
13:59:49	情報	2023-10-23 13:59:49
13:59:59	エラー	
Exceeded maximum execution time

このようにスクリプトが開始されてから6分を超えるとExceeded maximum execution timeが発生し、スクリプトは強制的に終了します。そのため、長時間かからないような処理の工夫がGASには必要となります。

プロパティの読み取り/書き込み

プロパティの読み書き.gs
function Qiita003_PropertiesReadWrite01(){
  // スプレッドシートを取得する
  let wSpread = SpreadsheetApp.openById('1xjdjN2uJefWlyN87SScPsnahWJ_NEVEuHiDxxBElPdU');
  let wSheet = wSpread.getSheets()[0];

  // 各カラムを取得しながら、値をセットする
  let wColA1 = wSheet.getRange(1, 1);
  wColA1.setValue('Qiita001');

  let wColB1 = wSheet.getRange(1, 2);
  wColB1.setValue('Qiita002');
  
  let wColC1 = wSheet.getRange(1, 3);
  wColC1.setValue('Qiita003');
}


function Qiita003_PropertiesReadWrite02(){
  // スプレッドシートを取得する
  let wSpread = SpreadsheetApp.openById('1xjdjN2uJefWlyN87SScPsnahWJ_NEVEuHiDxxBElPdU');
  let wSheet = wSpread.getSheets()[0];

  // 設定変更を行うセルの範囲を取得する
  let wRange = wSheet.getRange(1, 1, 1, 3); // A1~C1の1行3列を取得している
   
  // 値のリストを配列に格納する
  let wArray = ['Qiita001', 'Qiita002', 'Qiita003'];  

  // セルの範囲に値を一括で設定する
  wRange.setValues([wArray]);
}

上記プログラムは最終的な結果は同じです。
しかしながら、Qiita003_PropertiesReadWrite01の場合は、A1セルへgetRangeで読み取りsetValueで書き込み、これをB1およびC1にも同様に行うため、計6回の読み書きが発生します。
対して、Qiita003_PropertiesReadWrite02の場合は、セルの範囲を指定して、一括で読み込みおよび書き込みを行っており、計2回となります。この例ではこの程度の差ではありますが、こういった工夫によって制限回数の範囲内でやりくりをすることがGASには必要となります。

メール送信者数

メール送信者数.gs
function Qiita003_EmailRecipients() {
  console.log(MailApp.getRemainingDailyQuota());
  // MailApp.getRemainingDailyQuota()は残送信回数を確認する関数
  GmailApp.sendEmail('*******@gmail.com', 'Gメール送信回数確認','');
  console.log(MailApp.getRemainingDailyQuota());
}
実行結果
15:07:10	お知らせ	実行開始
15:07:11	情報	96
15:07:12	情報	95
15:07:12	お知らせ	実行完了

このように、メールが送信されるごとに残回数が減っていることがわかります。なお、sendMailの回数ではなく、あくまでもsendMailによって送信された宛先の数に依存するため、宛先が2名であれば1通のメールで2回分消費されます。

これは工夫のしようがないように見えますが、実は回避策があります。

おわりに

お疲れ様でした。
第3回は「GASの制限回数を意識しながら各種サービスにアクセスしてみよう」ということで、新たにGoogleカレンダーGoogleドライブGmailへのアクセスを体験しながら、GASの制限回数をお伝えいたしました。まだまだ序盤の域をでることはできていないため、業務での活用をイメージできないかもしれません。次回以降は、実際に実業務での活用に主眼を置きながら、データの取得編集を行っていきましょう。
記事を読んで、「良いな」や「今後に期待できる!」と感じて頂けたらいいねフォローコメントいただけると幸いです。それではまた次回をお楽しみに!

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

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

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?