これまで、リリースしたいくつかのサービスをgoogleが提供しているwebのページのアクセス解析アナリティクスであるGoogleアナリティクス(GAまたはUA)を使って、アクセス解析をしています。
また、アナリティクス解析をGoogleデータスタジオでレポートを作成して、そのレポートをメール配信していました。
さらに受信したメールからGASを使って、レポートの画像を取得して、Slackに自動投稿までしていました。
そんな中、ふと気づくと、自動投稿されるレポートの画像が古い日付のまま更新されていないことが判明しましたので、その原因究明と対応をまとめていきます。
アナリティクスレポートの自動送付
アナリティクスレポートは、Googleアナリティクスを使用して、さらにGoogleデータスタジオでレポートを作成して、1週間に一回メール配信しています。
Gmailを介さずに、Slackに直接自動投稿も考えましたが、レポートのメールの画質が荒くなることから一度、Gmailをはさむ方にしています。
レポートの配信は、毎週月曜日の7時に設定しており、確実にメールが届いているであろう、9時に最新メールを1件取得して、Slackに自動投稿していました。
Slackへの投稿はMy APPでオリジナルBotを作成していますので、アプリを作成後は発行されるトークンを利用してGAS内で完結しています。
これまでのGASのコード
これまでのGASのコードは以下のようになっていました。 定期実行の関数はmain()で、main()の中で、メールから添付ファイルを取得する関数serch_email_from_googleDataPortal()と受け取った写真とテキストを追加してSlackに投稿する関数file_upload_to_slack(attachment)が実行されています。
function serch_email_from_googleDataPortal() {
let query = "from: data-studio-noreply@gmail.com subject:GoogleアナリティクスUAレポート"
let Threads = GmailApp.search(query, 0, 1)
let messages = Threads[0].getMessages()
let message = messages[0]
// メールから画像を取得
let attachments = message.getAttachments()
for(attachment of attachments){
if (attachment.getName().indexOf('.jpg') > 0) {
return attachment
}
}
}
function file_upload_to_slack(attachment) {
let SLACK_TOKEN = "XXXXX SLACK_TOKEN XXXXX"
let data={
token:SLACK_TOKEN,
file:attachment,
file_type: 'jpg',
channels: 'XXXXX CHANNEL XXXXX',
title: 'XXXXX TITLE XXXXX',
initial_comment: 'XXXXX COMMENT XXXXX'
}
let option={
'method':'POST',
'payload':data
}
let res = UrlFetchApp.fetch('<https://slack.com/api/files.upload>',option)
return res
}
function main(){
let attachment = serch_email_from_googleDataPortal()
let res = file_upload_to_slack(attachment)
Logger.log(res)
}
メールが取得できなくなった原因究明
このGASの関数は毎週実行されるのですが、これまでエラーで処理が止まっていることはなく、Slackには毎週のように自動投稿がされていました。
正直、Slackの自動投稿あまり見ていなかったのですが、ある日ふと見ると、レポートの画像が古い日付のままじゃね!?と気づきました。
私が受信している定期報告のメールはいつも最新のレポートを受信していまいたので、Slackに投稿される画像が古いものだとは、まったく気づきませんでした。
Googleデータスタジオの変更
今回のエラーの原因は、これです。
Googleデータスタジオのサービス統合による変更
これまで、Googleデータスタジオとして、レポートを作成していましたが、これらを含むインテリジェンス(解析)サービスを統合するという記事がGoogleからありました。
Googleは、Lookerという同じくデータ解析のサービスであった会社を買収しています。 データスタジオとLokkerが両建ての状態でしたが、この日からLooker Studioという新たなデータポータルに統合されたようです。
詳細は、以下のGoogleのブログ(日本語訳)を確認下さい。
確かに、この情報は得ていたのですが、以前からGoogleデータスタジオを使用していたのでスルーしていました。
Googleデータスタジオの名称は消えますが、作成したレポートが消えるわけでもないし、メールの定期配信設定も特段操作を加えずとも、自動的にLooker Studioの方に移行されていたためです。
大きな落とし穴!?
GoogleデータスタジオからLooker Studioに統合されましたが、特段操作を加えなくとも定期的なメール配信は行われてました。
では、なぜGASによるメールの検索・レポート画像の取得が古いままになっていたのでしょう。
Googleデータスタジオから変更になり、送信元のメールアドレスが変わっていた。
原因は、これでした。
GASは、件名と送信元のアドレスの2つの条件をAND検索でメール検索を行っていたので、送信元のメールアドレスが変わってしまったことにより、該当する最新1件のメールがアドレス変更前の2022年11月時点のものをずっと取得していました。
プログラミングのコード(APIの使い方など)が間違っているわけでもなく、違いが検索条件にしているメールアドレスだったので、単純な過ちでしたが、原因を探すのに結構時間を要しました。
具体的な、送信元のアドレスとしては、Googleデータスタジオ時代は、「data-studio-noreply@gmail.com」でしたが、Looker Studioになり「looker-studio-noreply@gmail.com」となっていました。
GASの更新
原因究明する際に、GASに記載しているコードの書き方を誤っていないか。
また、GASのAPIまたはSlackのAPIに何か変更が生じていないかと、探っていましたが、原因はとても単純でメールアドレスが変わったので、検索できていないというものでした。
これまでITの世界に触れてきていないので、IT業界の移り変わりの速さはいつも脱帽ものです。
Looker Stuidoもいつか変更される可能性があるので、今回は、送信元のアドレスと件名のAND検索から件名だけの検索に切り替えました。
function serch_email_from_googleDataPortal() {
let query = "subject:GoogleアナリティクスUAレポート"
let Threads = GmailApp.search(query, 0, 1)
let messages = Threads[0].getMessages()
let message = messages[0]
// メールから画像を取得
let attachments = message.getAttachments()
for(attachment of attachments){
if (attachment.getName().indexOf('.jpg') > 0) {
return attachment
}
}
}
これで無事に、最新のレポートが投稿できました。
おわりに
IT業界の移り変わりの速さは、すごいですね。 これまでいた業界のスピードとは、雲泥の差です。
今日できていたものが、明日からは通用しない(さすがにそこまで早くないw)なんてこともあるでしょうから、継続してスキルアップと情報収集は努めないといけないなと感じました。
リリースしたサービスも常に最新情報をウォッチしていかないと
コメント