Allegro!

JavaやIT系小ネタ、趣味の話まで。

【GAS】既読無視させない!スプレッドシートの更新をworkplaceFeedに通知する方法!

既読無視?させません!!!

 

さて、掲題の通り『更新用Botを作る手順』をメモします。
実はチャットに通知するBotも作りたかったのですが、出来ませんでした!!!

その理由は、Botメンバーとして追加する必要があるのですが不幸にもその権限がなく、権限のある方に頼むことも出来ませんでした。。。

今回のゴールはフィード投稿を行うまでをゴールとします。

 

事の発端

事の発端は、会社のメンバー間でスプレッドシートを使ってごにょごにょしてましたと。
しかーーし!シートを更新しても、誰も何も気付きません。。。

出来るだけ早く見てもらって返答が欲しいのに、誰が今編集してて更新しようとしてるのかが分からない…。

そこで、PaZooは考えました。どうにかしてスプレッドシートを更新したら通知を出せるようにならないかと。んで、今日出来るようになりました。

というか、すでにやってる人がいました。本当にありがたい。

qiita.com

作成手順

今回は「スプレッドシートが更新されたらworkplaceに通知する」ものを作りました。

また、スプレッドシートが更新された時は更新日時を自動で書き込んでくれるスクリプトも組んでます。

下記にリンクを貼っていますので、興味がある方は是非ご覧ください^^

pazoo.hatenablog.com

1.スプレッドシートを作成

新しいスプレッドシートを作成しましょう。今回は「TODO」という名目で作りました。

f:id:PaZoo:20190930005300j:plain

 

2.チェックがついたらアクションするコードを作成します。

メニューバーからツール->スクリプトエディタ

を選択してください。

f:id:PaZoo:20190930005710j:plain

 

スクリプトエディタを開くと、中はこんな感じです。

 

f:id:PaZoo:20190930010518j:plain

 

上のような画面が表示されたら下のスクリプトを書きましょう。

 

constants.gs
var CHECK_COLUMN = "1"; // 通知カラム数(A)
 
main.gs
/**
 * アクティブセルのステータスをチェック
 * トリガー: 編集時
 */
function getState() {
var sheet = SpreadsheetApp.getActiveSpreadsheet(); var activeCell = sheet.getActiveCell(); var rowNum = activeCell.getRow(); // チェックBOXがアクティブ&&チェック付いてる時、通知する if(activeCell.getColumn() == CHECK_COLUMN && activeCell.getValue()) { // 同列の値も取得して通知します Browser.msgBox('日付: ' + sheet.getRange('B' + rowNum).getValue() + '\nタスク: ' + sheet.getRange('C' + rowNum).getValue()); } }

  

チェックがついたかを調べるために、コードの実行を行ってください。

スクリプトは「トリガーの設定」により、実行されます。

 

トリガーの設定とは
トリガーの設定は、スクリプトエディタ上部にある編集->現在のプロジェクトのトリガーから行ってください。

 

f:id:PaZoo:20190930012000j:plain

 

トリガーの追加

f:id:PaZoo:20190930013834j:plain

f:id:PaZoo:20190930013834j:plain

f:id:PaZoo:20190930013945j:plain

f:id:PaZoo:20190930014301j:plain

その後は、アクセスを許可まで行ってください。

3.WorkplaceBotアプリを作成

※注意※ Botを作成するためにはグループ管理者権限が必要です。

Botを使うグループのメニューから統合を開きます。

投稿

f:id:PaZoo:20190930015221j:plain

投稿ボットを作成を選択してください。こちらからBotが作成出来ます

今回は、テスト用として作ってみます。

f:id:PaZoo:20190930015451j:plain

プロフィール画像Botのアイコンを選択出来ます。

②名前:Botのお名前です。今回は「更新通知用Bot」とつけます。ネーミングセンスのなさは元からです。

③簡単な説明:ここは省略可能ですが、Botが何のために作成されたか背景くらいは書いておくと良きかもです。

作成が完了すると…

f:id:PaZoo:20190930015955j:plain

こんな感じのポップアップが表示されます!!
今回の更新通知用Botは、APIを使った通知用Botなのでアクセストークンが必須です。
なので、このポップアップに表示されたトークンたちを必ずメモしてください!

4.Bot通知する

それでは、GASに戻って先ほど取得したトークンをコードに書きましょう!

 

constants.gs
// workplace
var FACEBOOK_API_URI = 'https://graph.facebook.com/v3.0';
var WORKPLACE_ACCESS_TOKEN = 'DQVxxxxxxx';

 

main.js
/**
 * アクティブセルのステータスをチェック
 * トリガー: 編集時
 */
function getState() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeCell = sheet.getActiveCell();
  var rowNum = activeCell.getRow();
  // チェックBOXがアクティブ&&チェック付いてる時、通知する
  if(activeCell.getColumn() == CHECK_COLUMN && activeCell.getValue()) {
    // 同列の値も取得して通知します
    postWorkPlaceFeed('日付: ' + sheet.getRange('B' + rowNum).getValue() + '\nタスク: ' + sheet.getRange('C' + rowNum).getValue());
  }
}

/**
 * Workplaceに投稿する
 */
function postWorkPlaceFeed(text) {
  UrlFetchApp.fetch(FACEBOOK_API_URI + '/group/feed?&access_token=' + WORKPLACE_ACCESS_TOKEN, {
    method : 'POST',
    contentType : 'application/json',
    payload : JSON.stringify({
      message: '# 更新されました\n' + text, // 投稿内容です
      formatting : 'MARKDOWN' // MarkDown使いたい場合はここにいれましょう
    })
  });
}

 

そして、公開前に認証を許可しなくては使えないのでスクリプトエディタ上部の編集->現在のプロジェクトのトリガーからスクリプトを実行してください。

実行させると、、、

f:id:PaZoo:20190930020958j:plain

こんな感じでポップアップが表示されるので、手順に従って承認してください!

そして、Workplaceに投稿されたら成功です!

f:id:PaZoo:20190930021534j:plain

Fin

と、いう事でこれにて完了!ですね。

Workplaceスプレッドシートの連携についての資料は少なかったので非常に困りましたが、ネットで検索かけまくるとといっぱい出てくるぅ!!やはりGoogleは偉大ですね!