内藤 裕二/ 2024年 5月 21日/ 技術

こんにちは!内藤です!
寒暖差が激しくなっていますね。体調管理に気を付けたいです。

弊社では社内の蔵書管理にサスケWorksを使用しています。
参考:社内の蔵書管理にサスケWorksを使い始めました

蔵書管理としては非常に使いやすくなったのですが、書籍の登録後社内に周知する際は、登録した人が社内Slackに投げていました。
2024年3月にリリースされた、サスケWorksのオートメーション機能を使用して、この部分を自動化してやろう、というのが今回の趣旨です。
参考:新機能「オートメーション機能」をリリース!

全体像

下記の流れで機能を実現します。

  1. サスケWorksにレコードが新規登録されたタイミングで、Gmailにメールを送信する
  2. GmailアカウントでGASスクリプトを用意し、定期的にメールをチェックする
  3. メールが存在したら、本文からSlackに送信するメッセージを作成し、投稿する

Slack側の設定は別件で作成したアプリを使いまわしていますので、本記事では取り扱いません。
下記記事に詳しい手順が載っているので、参考にしてください。

【google-app-script】gasを利用してslackに投稿するbotを作る

サスケWorks側の設定

サスケWorksのアプリの右上のスパナマークをクリック

表示された設定画面で、機能一覧から「オートメーション機能」をオンにします
左側のメニューに「オートメーション設定」が表示されます

左メニューに表示された「オートメーション機能」をクリックして、オートメーション設定一覧画面を表示します
右上の「追加」をクリックして、オートメーション設定を追加します

オートメーション設定をしていきます



設定項目 設定値
イベント選択 書籍登録時に通知したいので、「レコード登録完了時」にします
アクション 「メール送信」をオンにします
送信先種別 「固定のメールアドレス」を選択します
送信先メールアドレス メール送信用のGmailアドレスを記載します
送信方法 一件ずつSlackに通知したいので、「レコード単位で送信」を選択します
差出人名 メールのFrom欄に設定する値を記載します
件名 メールの件名を記載します
本文 最終的にはSlackに出力するので、必要なデータだけを出力するように設定します
オートメーション名 わかりやすい名前を付けます

設定完了したら「登録」をクリックすると、オートメーション設定が追加されます。

試しにレコードを追加して、設定したアドレスにメールが届いているか確認します。

Gmail側の設定

Gmail側の設定です。
下記の条件を満たす必要があります。

  • サスケWorksから来たメールにだけ反応したい
  • 一度通知した内容は、再通知しないようにしたい

方法はいろいろとありますが、Gmailの自動振り分けを使用して、サスケWorksから来たメールにラベルを付けるようにします。

Gmailのサイトにアクセスしてメールボックスを開きます。
先ほど試験送信したメールを表示し、「メールの自動振り分け設定」をクリックします。

「From」に送信元メールアドレスを、「件名」にサスケWorks側で設定したメールの件名を設定します。
「フィルタを作成」をクリックします。

「受信トレイをスキップ(アーカイブする)」にチェックを付けます
「ラベルを付ける」にチェックを付けます。
「ラベルを付ける」のコンボボックスから「新しいラベル」を選択して、ラベル「SaaskeWorks」を作成します。
「xx件の一致するスレッドにもフィルタを適用する」にチェックを付けます
「フィルタを作成」をクリックします。

対象のメールが受信トレイから消え、指定したラベルがつけられていれば、完了です

GAS(Google Apps Script)の作成

Gmailを確認して、Slackに投稿するスクリプトを作成します。

Gmail設定をしたアカウントで、Google Driveを表示します。
適当なフォルダで右クリックして、「Google Apps Script」を選択します。

共同編集者に関する警告が表示されるかもしれません。
「スクリプトを作成」をクリックします。

プロジェクト名をわかりやすい名前に変更します

「ファイル」の一覧から、ファイル名をわかりやすい名前に変更します

Slack送信用のライブラリを追加します。
「ライブラリ」の右の「+」マークをクリックします。

スクリプトIDに1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bqを入れて検索します。

ライブラリが見つかったら、「追加」をクリックします。

「ライブラリ」の下に、「SlackApp」が追加されます。

Slackに投稿するためのトークンと、投稿対象のチャンネル名を、スクリプトプロパティに設定します。
左側メニューの歯車マークをクリックします。

下の方にスクロールして、「スクリプトプロパティを追加」をクリックします。

「Slack_CHANNEL」「Slack_TOKEN」の2つのプロパティを追加し、それぞれ投稿先のチャンネル名、アクセストークンを設定します。
設定後、「スクリプトプロパティを保存」をクリックします

左のメニューから「<>」マークをクリックして、コード編集ウィンドウを表示します。

もともとのコードを削除し、メールの内容をチェックしてSlackに送信するコードを記載します。

プログラムの流れは、

  1. Gmailのメールボックスから、下記を満たすメールを取得します
    • ラベル「SaaskeWorks」 が設定されている
    • 未読である
  2. メールの本文を解析して、Slackに投稿する内容を作成します
  3. 作成した内容をSlackに投稿します
  4. メールを既読にします
  5. 取得したメールの数だけ、上記を繰り返します

コードは、下記になります。
それぞれの環境に合わせて改造してみてください。

///
/// エントリ関数
///
/// - SaaskeWorksから送信したメールをGMailのメールボックスから探す
/// - メールが存在した場合は、Slackに通知する
///
function notifyNewBookInfo() {

  // GASのスクリプトプロパティの取得
  var scriptProperty = PropertiesService.getScriptProperties().getProperties();
  // Slack関連パラメータ
  var Slack_Token = scriptProperty.Slack_TOKEN;
  var channel = scriptProperty.Slack_CHANNEL;
  // SlackAppインスタンスを生成
  var slackApp = SlackApp.create(Slack_Token);

  // Gmailのメールボックスを確認
  let threads = GmailApp.search('label:saaskeworks is:unread');
  for(let thread of threads) {
    // メール本文を取得
    let msgs = thread.getMessages();
    // 該当メッセージについて送信
    if(msgs[0]) {
      // メッセージ本文を行ごとに分解
      let msg = msgs[0];
      let contents = msg.getPlainBody();
      let content_lines = contents.split('\n');
      if (content_lines.length > 8) {
        // 行数があっている場合
        reportToSlack(slackApp, channel, content_lines);
      }
      // 既読にする
      msg.markRead();
    }
  }

}

///
/// 追加された書籍情報をSlackに報告する
///
function reportToSlack(slackApp, channel, content_lines){

  let link_url = content_lines[0];
  let title = content_lines[1];
  let author = content_lines[2];
  let publisher = content_lines[3];
  let regist_user = content_lines[4];
  let tag1 = content_lines[5];
  let tag2 = content_lines[6];
  let tag3 = content_lines[7];
  let image = content_lines[8];

  var option = {
    attachments: JSON.stringify([
      {
        "fallback" : "Registered book.",
        "color": "#910000",
        "title": title,
        "title_link": link_url,
        "fields": [
          {
            "title": "作者",
            "value": author,
            "short": "true",
          },
          {
            "title": "出版社",
            "value": publisher,
            "short": "true",
          },
          {
            "title": "タグ",
            "value": tag1 + "," + tag2 + "," + tag3,
          },
          {
            "title": "登録者",
            "value": regist_user,
          },
        ],
        "image_url": image,
      }
    ])
  }  

  var text = "新しい書籍が登録されました!";
  sendMessageToSlack(slackApp, channel, text, option);

}

///
/// Slackにメッセージを送信する
///
function sendMessageToSlack(slackApp, channel, text, additionalOptions){

  // 必ずつけるOptionを定義
  var option = {
    username: "Librarian",    // Slackに投稿するユーザ名
  }

  // 追加オプションを連結
  if (additionalOptions){
    for(var key in additionalOptions){
      option[key] = additionalOptions[key];
    }
  }

  slackApp.postMessage(channel, text, option);

}

GASの自動実行を設定する

ここまでで処理のほとんどは完了です。
最後に、作成したGASスクリプトを定期的に実行する設定をします。

左のメニューの時計のマークをクリックします

右下の「トリガーを追加」をクリックします

「時間ベースのトリガーのタイプを選択」を「分ベースのタイマー」に設定
「時間の感覚を選択(分)」を「1分おき」に設定
「保存」をクリックします

これで、1分おきにGmailを確認し、サスケWorksからのメールをSlackに通知するようになります。

まとめ

サスケWorksのオートメーション機能は、工夫すればいろいろと使えそうです。
また、ちょっとした処理を行うコードを記載するプラットフォームとして、GASは優秀だと思いました。

サスケWorks関連記事はこちら

本ブログでは他にもサスケWorks関連の記事をアップしています。

NorthTorch - サスケWorks 関連記事

ぜひ、別記事の方もご覧ください。

参考URL