🤖

Slack APIをGASで扱おうとしてハマった話

2023/09/15に公開

はじめに

こんにちは。新卒エンジニアのwinnieです 🐥

研修期間中に、社内コミュニケーションを促進するためのアプリをSlack API × Google Apps Script(GAS)で開発しました。その際、APIから取得した値をGoogleスプレッドシートに保存するところで少しハマったので、記事にしてみます。

概要

Slackでは、メッセージをIDではなく送信日時とチャンネルの組み合わせで管理しています。

具体的には ts パラメータ[1](もしくは message_ts[2] thread_ts など[3])で管理しており、これはUNIXタイムスタンプの形式です。

The ts value is essentially the ID of the message, guaranteed unique within the context of a channel or conversation.
They look like UNIX/epoch timestamps, hence ts, with specified milliseconds. But they're actually message IDs, even if they're partially composed in seconds-since-the-epoch.
The ts of a message can be used in many operations such as replying to it in a thread, or modifying the message. But it can also be used to retrieve the message by itself.[4]

この ts をGoogleスプレッドシートで管理しようとしたところ、保存した値でメッセージが取得できず、時間を費やしてしまいました。

結論

Googleスプレッドシートでは数値を15桁までしか入力できず[5]、 値が切り捨てられていたことが原因でした。.toString() メソッドを使い[6]、文字列として保存することで解決します。

1677204291.513459  // 元のts
1677204291.51345  // 切り捨てられたts

ちなみに、スプレッドシートの数値型は倍精度浮動小数点数のため、64ビット → 15桁の精度になっているらしいです。

おわりに

解決方法は簡単でしたが、パッと見で切り捨てられていることが分からなかったので意外と苦戦しました。普段はPythonやJavaScriptしか触らないので、小数点の精度を気にしたこともなかったです。

IDは文字列で保存するのがベターですね〜

脚注
  1. message event | Slack ↩︎

  2. chat.getPermalink method | Slack ↩︎

  3. Reference: Message payloads | Slack ↩︎

  4. Retrieving messages | Slack ↩︎

  5. 単精度浮動小数点(有効桁数15桁)【スプレッドシート】 | EGUWEB ↩︎

  6. Google Apps ScriptでString型文字列を数値に変換する方法(数値→文字列も) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門 ↩︎

GitHubで編集を提案
株式会社アクティブコア

Discussion