「業務の改善」または、「業務の効率化」を目指している方、こんにちは。
今回は、「Google Apps Script(GAS)」を使った業務の改善・効率化の事例紹介の第六弾です。
弊社は、協同組合様や運送事業者様向けにETCカードの管理・請求書・走行明細書発行システム「ETCクラウド」を提供していますが、システムだけでなく、運用業務のアウトソーシングもお受けしております。
そのアウトソーシングでお受けしている運用業務の効率化、ミス削減のために行っている事例をご紹介させていただければと思います。
前回は、「Webサイトの更新を通知する」方法をご紹介しましたが、今回は、 「Google Apps Script(GAS)」 と「Gmail」と「LINE」の連携による「業務の改善・効率化」の事例をご紹介します。

一般的に業務上の連絡は、メールで来ることが多いかと思いますが、特定のお客様のメールや、特定の内容が記載されたメールだけをLINEに通知したいと思ったことはないでしょうか?
「Google Apps Script(GAS)」を使えば、特定のメールだけをLINEへ通知するスクリプトを作ることができます。
もちろん、スマホには、新着メールを通知する機能もありますが、全部のメールを通知する必要はなく、「特定」のメールだけを通知してほしいので使っていないという方が多いのではないでしょうか。
メールを見る環境に常時いるわけではないと思いますが、ほとんどの人の場合、スマホは常時もっているかと思います。必要なメールをLINEに集約するとかなり便利になります。(リアルタイム性を求める人にはオススメしません。理由は後述します。)
スクリプトの作り方は以下が参考になります。
【GAS】特定のGmailをLINEに転送する方法(GmailとLINEの連携) (魚拓)
内容としては、特定の条件でGmailのスレッドを検索(スター付きメールは除外)し、該当するメールがあれば、本文をLINEへ転送、該当メールにはスターを付けて処理済みステータスとするというものです。
特定の条件(メールアドレスや本文、件名、未読、既読など)は、スクリプト内で定義すればOKです。個人的には、業務でこのスクリプトは利用していますが、プライベートでも利用しています。
Googleは、教育機関向けに「Google Workspace for education」というものを提供しており、コロナ禍において学校のオンライン授業などは、この中の「Google Classroom」というツールを通して行われているケースが多くなっています。

うちの小学生の娘もこの「Google Classroom」を利用していて、毎日、担任の先生が、このツールで翌日の時間割や持ち物、宿題などを通知しているのですが、子供の予定を確認するのが面倒でした。
※ 「Google Classroomアプリ」もあるのですが、デフォルトでは保護者用のアカウントを設定しているので、子供用のアカウントに毎回切り替えるのが面倒でした。
なにかいい方法はないかと考えたところ、先生が「Google Classroom」に投稿すると、通知は、子供ごとに割り当てられたGmailにも届いていることがわかったので、Gmailに届いた先生からの通知をLINEに転送するように子供のアカウントの「Google Apps Script(GAS)」にスクリプトを設定して利用しています。
また、学校以外にも塾や習い事などそれぞれで登下校メールやお知らせメールなどがあり、子供の予定や情報をLINEに集約したいというニーズがありました。特定のメールをLINEへ転送することで、LINEを見れば、子供に関する情報が集約されていて非常に便利になりました。
スクリプトは以下です。
var query = "subject:●●●メールタイトルの検索条件●●●";
//例) var query = "subject:(テスト) from:xxxx@gmail.com";
//メールをチェックし条件に該当するメールをLINEに通知する
function getMail(){
//指定した条件でスレッドを検索して取得
var myThreads = GmailApp.search(query, 0, 10);
//スレッドからメールを取得し二次元配列に格納
var myMessages = GmailApp.getMessagesForThreads(myThreads);
for(var i in myMessages){
for(var j in myMessages[i]){
//スターがないメッセージのみ処理
if(!myMessages[i][j].isStarred()){
var strDate = myMessages[i][j].getDate();
var strmsg = Utilities.formatDate(myMessages[i][j].getDate(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')+"\n"; //タイムスタンプ
//strmsg += myMessages[i][j].getSubject() + "\n";//Subject
strmsg += myMessages[i][j].getPlainBody().slice(0,500);//本文の先頭から500文字
//LINEにメッセージを送信
sendLineMessage(strmsg);
//処理済みのメッセージをスターをつける
myMessages[i][j].star();
}}}}
//LINEにメッセージを送信する
function sendLineMessage(msg) {
const url = 'https://api.line.me/v2/bot/message/push';
const token = '●●●●●●'; //「個人タスク通知くん」のチャネルアクセストークン
const message = msg;
const payload = {
to: '●●●●●●', //ユーザーID
messages: [
{ type: 'text', text: message }
]
};
const params = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + token
},
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(url, params);
}
GASでのGmail検索は、以下の2種類の方法があります。
・GmailApp.search(query)
・GmailApp.search(query, start, max)
queryが検索条件、startとmaxは検索した結果をどこからどこまで取得するかを指定します。
query:検索条件の指定(キーワード、アドレス、状態、送受信時間等)
start:検索結果を何件目から取得するか
max:検索結果を何件分取得するか
queryの使い方ですが、以下のような感じです。
・GmailApp.search(‘●●●●●’) ← 件名、本文などから検索
・GmailApp.search(‘subject:▲▲▲▲’) ← 件名で検索
・GmailApp.search(‘filename:■■■■’) ← 添付ファイル名で検索
・GmailApp.search(‘from:aaaa@example.com’) ← 送信元で検索
・GmailApp.search(‘to:bbbb@example.com’) ← 送信先で検索
・GmailApp.search(‘cc:cccc@example.com’) ← CC先で検索
・GmailApp.search(‘bcc:dddd@example.com’) ← BCC先で検索
・GmailApp.search(‘is:unread’) ← 未読メール検索
・GmailApp.search(‘is:read’) ← 既読メール検索
・GmailApp.search(‘●●● OR ▲▲▲’) ← OR検索
・GmailApp.search(‘●-■’) ← 除外検索(●含むが■を含まない)
・GmailApp.search(‘subject:(●-■)’) ← 検索条件のグループ化
・GmailApp.search(“■■■■”) ← 完全一致検索
使用例としては、以下のような感じです。
・GmailApp.search(‘subject:納期アラート is:unread’, 0, 10)
とすれば、件名に「納期アラート」を含む未読のメールを1件目から10件分取得します。より詳しく知りたい方は、以下サイトをご参照下さい。
トリガーは以下の画面では、10分に1回スクリプトを実行する設定ですが、実際は、1時間に1回にしています。トリガーの設定としては、1分に1回にすることもできますが、GASやGmailには実行回数やメール送信数など制約があるので、1時間に1回くらいが適度だと思います。これがリアルタイム性を求める方には、この方法をオススメできない理由です。

必要なメールをLINEに集約することは、作業の効率化の1つになるかと思います。参考になれば幸いです。