虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

GAS LT会に参加してわかったGASの便利な使い方 #虎の穴ラボ Advent Calendar 2023

  • 本記事は 虎の穴ラボ Advent Calendar 2023 5日目の記事です。(予約投稿)
  • 前回は山田さんによる『「ChatGPTの頭の中」を読んでみました』でした。
  • 次回はおっくんさんによる「Fresh(Deno)をプラグインで拡張しよう」です。ご期待ください!

こんにちは、虎の穴ラボのS.Aです。
今年もアドベントカレンダーの季節がやってきました。

私の今年の目標はエンジニアのLT(ライトニングトーク)会でアウトプットすることだったので、一年を通して何度かLT会に参加してきました。 直近では、とらラボが主催する「Google Apps Script LT会! vol.2」 に参加しましたので、今回はGASの話をしようと思います。 LT会の実際の配信は、YouTube にアーカイブされていますので、是非ご覧ください。

yumenosora.connpass.com

GASとは

GAS(Google Apps Script) は、ブラウザ上でスクリプトを書いて実行できる環境です。 使用する言語は、JavaScript ベースの言語なので、JavaScript が書ける人であればすぐに使いこなせると思います。 スクリプトの中で、例えば Google Spread Sheet のデータを読み書きしたり、外部の Web API を叩いたりできるので、 使いこなせれば社内ツールを作って業務改善なんてこともできそうです。

使い方は簡単で、Google ドライブの 新規 ボタンから その他 > Google Apps Script と進むと、 GASのプロジェクトが作られ、そこですぐにスクリプトを書き始めることができます。

▼Google ドライブから新規で作成に進む 新規スクリプトを追加する画面のキャプチャ画像

▼コーディングできる画面に GASのエディタのキャプチャ画像

GAS はトリガーでの定時実行が簡単!

個人的にGASの一番簡単で実用的な使い方は、スケジュール実行だと思っています。
GASでは、書いた処理をトリガーと呼ばれる機能で定時実行させることができるので、cron 実行のようなことを、自前のサーバいらずで実現できます。

冒頭で述べたGAS LT会の登壇でも、 社内で定刻に Google Meet のリンクを社内チャンネルに通知する bot を紹介したのですが、 こちらも Slack の Web API を叩くスクリプトを書いて、スケジュール実行することで実現しています。

スケジュール実行ができればそれだけで色々なツールができそうです。 例えば...

  • 毎朝、朝のミーティング5分前に、ミーティング用のリンクを社内チャットに通知する
  • 毎朝天気予報の情報を取得してメールを送信する
  • 毎晩チャット履歴を取得して勤怠情報をスプレッドシートに集計する

やり方は簡単で、トリガータブ(左側の目覚まし時計のアイコン)から設定を追加するだけです。 例えば毎日10時ごろに実行したい時は、時間手動型 日付ベースのタイマー 午前10時〜11時 を設定すればOKです。

▼トリガー設定 定時実行のトリガー設定のキャプチャ画面

分単位での実行もできる!

先ほどのトリガー設定画面のUIを見て気づいた方もいるかもしれませんが、 画面からでは実行時刻を分単位で設定できません。

一見1時間単位でしかスケジュール設定できないのかなーと思いきや、別の方法で分単位のスケジュールも可能でした。 トリガーの追加は、設定画面から以外にも、スクリプト内からトリガーを設定する関数を呼び出すことでできるのですが、 その際に渡す Date オブジェクトを例えば10時45分などにしておくと、10時45分に起動するトリガーが設定できます。

そしてそのトリガーを設定する処理を、1時間単位のトリガーで事前に画面から設定しておけばOKです。

▼トリガーを設定する関数の例

function setTrigger() {
  const time = new Date();
  time.setHours(10);
  time.setMinutes(45);
  // myFunction関数を10時45分に呼び出すトリガーを追加
  ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
}

▼トリガーを設定する関数を用意 トリガーを設定する関数の例

▼トリガーを設定する関数を実行するトリガーを画面から設定 トリガーを設定する関数のトリガーの設定例

休日のスキップもできる!

社内チャットに投稿する系のbotは、土日や祝日には動かしたくない...なんてこともあるかと思います。 そんなときは、トリガーで一旦毎日実行するように設定したのち、 スクリプト内で本日日付を取得して、土日祝日であれば後続処理を行わないようにすればOKです。

土日をスキップするのであれば、単純に new Date() で今日日付を取得し、 getDate() で取れる曜日の数値(JavaScript と同じく日曜日始まりで0〜6の値)を判定すれば実現できます。

また、祝日は Google が用意する日本の祝日のカレンダーのオブジェクトを読み込むことで、 自前で複雑な判定処理を書かずに判定することができます。とっても便利! CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com") とすることで日本の祝日カレンダーを読み込み、 getEventsForDay()関数に今日日付を渡して何かしらのイベントが帰ってくれば祝日、という形になります。

▼土日祝日正月休みを判定する処理の例

function isHoliady() {
  const today = new Date();
  const japaneseHolidayCalendar = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com")
  const events = japaneseHolidayCalendar.getEventsForDay(today);
  if(events.length) return true; //日本の祝日
  
  const dayOfWeek = today.getDay();
  if(dayOfWeek === 0 || dayOfWeek === 6) return true; //土日
  
  const month = today.getMonth() + 1;
  const dayOfMonth = today.getDate();
  if(month === 12 && dayOfMonth === 31) return true; //大晦日
  if(month === 1 && dayOfMonth <= 3) return true; //三が日
  return false;
}

▼GAS上でこのように書いておけばOK 休日スキップする例

LT会で知ったGASのこんな使い方

GAS LT会では、ここで書いた内容と実際の活用例を発表したのですが、 他に登壇した方の発表や、LT会後の懇親会でのトークで、他にもさまざまな使い方があることを知りました。 例えば...

  • Google Form で入力があったらそれをトリガーに処理を実行する
  • Spread Sheet 上のオブジェクトがクリックされたら処理を実行する
  • GASでWeb API が作れる
  • HTMLも用意すれば Web アプリができる

などなど。

また、GASは外部の Web API と合わせて使うことでいろんなことができるため、 便利な Web API の情報が得られた GAS LT会は有意義でした。 話で出てきたもので言えば、 DeepL の翻訳APIや、ISBNからデータを取得できる Google Books API など...

終わりに

GAS で何ができるかを把握しておいて、今後何かしら社内ツールなどが必要になったとき、 「GASのアレを使えば実現できるぞ...!」とパッと思い浮かべることができるようになれば大きな武器になりそうです。 今後も LT会などエンジニア同士でナレッジを共有し合い、使える武器を増やしていきたいと思いました。

とらラボではGAS 以外にも、さまざまなテーマの LT会を定期的に主催していますので、 connpass で予定されているイベントをウォッチしていただければと思います。 「見るだけでなく発表もしてみたい...!」という方は、登壇も大歓迎ですのでぜひ参加をご検討ください!

▼とらラボの connpass ページ yumenosora.connpass.com

採用情報

虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp