ご無沙汰しております!
最近めっきり記事を書けておりませんでした。反省。
以前、スプレッドシートとSlackを連携させ、タスク管理の業務改善に成功した例を
記事に書かせていただきましたが、もっと効率化を求め、弊社サービスのSPALO(スパロ)とも連携してみました!関連記事をご覧になってない方はまず、こちらの記事をお読みください。
【タスク管理のコツ】期限までのスケジュールを可視化!GASを活用したアラート機能を実装!Slackなどのチャットツールに投稿しチーム内での共通認識が芽生えタスク漏れの回避に。
【システム連携】GASを活用し、Slackとスプレッドシートを連携!タスク漏れの回避を実現。無料でできる簡単システム連携方法についてのご紹介
SPALO(スパロ)とは
SPALOとは慣れ親しんだ「チャット」を活用し入力のできるチャット入力ツールです。
ビジネスにおいて、見過ごすことのできないもののひとつ、「報告業務」において、チャットの質問に答えるだけでExcelなどのドキュメント作成や、システムへの書き込みが可能です。このような技術で特許も取得しています。(特許第6682638号)
今回やった内容
SPALOを使ってスマホからでも簡単にスプレッドシートの入力をする
※SPALOをご利用するにはお申込みが必要です。
詳しくはこちらをご覧ください。
SPALO WEBサイトはこちら
何故やろうと思ったのか
以前までタスク管理はスプレッドシートに直接入力していたが、PCを開かず気軽に登録できるよう、スマホで入力したいと思うシーンが何度かあったため。
例)外出先でお客様から見積の依頼を受けたため、タスク管理シートに登録したいがパソコンが開ける状態ではない(電車移動中など)。
例)業務を終了していたが、やり残した作業を思い出したため明日のタスクとして登録したいがパソコンを開くのは面倒。
弊社のサービスであるSPALOは外部連携可能なほぼ全てのサービスと連携が可能です。
そこで、Googleスプレッドシートで運用しているタスク管理シートと連携し、スマホからも簡単に入力ができるようにチャットボットを作成しました。
タスク管理の入力内容

- 担当者
- 依頼者
- 依頼日
- 期限日
- 期限日までの日数(ここは自動計算)
- 大カテゴリ
- 中カテゴリ
- 内容
- URL(必要な時のみ入力)
- 想定工数
- ステータス
—————————————————————
上記①~⑪のうち、入力必須箇所をSPALOでチャット形式に入力します。

チャットボットが画像のように「担当者は?」「期限日は?」などと入力したい項目に対する質問文を投げかけてくれます。普段LINEなどでご家族や友人と会話をするかのように応答するだけでスプレッドシートに書き込みに行ってくれます!
どうやって連携しているのか?
SPALOには外部連携機能があります。つまり外部サービスと連携することで、他のサービス(今回だとスプレッドシート)に情報を書き込みに行ったり、他のサービスからマスタデータなどを参照する(検索する)ことができます。
そこで、今回もGAS(Google Apps Script)を使ってSPALOとスプレッドシートの二つの
サービスを連携することにしました。
SPALOのボットには2種類の外部連携を使用しています。
1)SPALOで回答した情報をスプレッドシートに書き込む(送信Webhook)
2)スプレッドシートに記載したカテゴリ一覧のマスタを参照する(参照Webhook)


書いたコードはこちら
1)SPALOで回答した情報をスプレッドシートに書き込む(送信Webhook)
function doPost(e) {
// getData
const jsonString = e.postData.getDataAsString();
const body = JSON.parse(jsonString);
Logger.log(jsonString);
console.log(jsonString);
// data setting
const eventTime = body.eventTime;
const workspaceName = body.workspaceName;
const groupName = body. groupName;
const botName = body. botName;
const historyId = body.historyId;
const senderName = body.senderName;
//送信データ(SPALOのチャットボットの項目名とイコール)
let tantousya = body.data['担当者'];
let iraisya = body.data['依頼者'];
let iraibi = body.data['依頼日'];
let kigenbi = body.data['期限日'];
let daikate = body.data['大カテゴリ'];
let tyukate = body.data['中カテゴリ'];
let naiyou = body.data['内容'];
let kousuu = body.data['想定工数'];
let status = body.data['ステータス'];
//スプレッドシートを指定
let datasheet = SpreadsheetApp.openById("スプレッドシートのURLを記載").getSheetByName('スプレッドシートのシート名を記載');
//最終列を持ってくる
let lastRow,lastCol
lastRow = datasheet.getLastRow();
lastCol = datasheet.getLastColumn();
let hairetu = datasheet.getRange(17, 2, lastRow-17, 1).getValues();
let nyuuryokukasyo = hairetu.filter(String).length; //filter(String)⇒文字列が入っているとこを取得する
nyuuryokukasyo = nyuuryokukasyo+17
let data = [[tantousya,iraisya,iraibi,kigenbi,"",daikate,tyukate,naiyou,"",kousuu,status]]; //,"",でセルを一つ飛ばす
//スプシを指定してとるセルと範囲を指定した→最後に値を貼り付ける
datasheet.getRange(nyuuryokukasyo,2,data.length,data[0].length).setValues(data);
let shiki = '=IF(E'+nyuuryokukasyo+'="","",E'+nyuuryokukasyo+'-TODAY())'
datasheet.getRange(nyuuryokukasyo,6).setFormula(shiki);
}
————————————————————————————————————————-
2)スプレッドシートに記載したカテゴリ一覧のマスタを参照する(参照Webhook)
function doPost(e) {
/*
let body = {
"webhookKey": "85126C79CBF9FE36BB9D05D0639C70C235C18D37",
"secretHash": "$2y$10$ee1ZuZ6XSxEkzq9egVTLL.OlU7wb/WCgY0ORQyCZpfiDihoPH3rXj",
"event": "SEARCH",
"eventTime": "2020-10-16 14:00:00",
"item_name": "中カテゴリ",
"data": [
{
"title": "大カテゴリ",
"value": "マーケティング"
},
{
"title": "時間",
"value": "12時48分"
},
{
"title": "場所",
"value": "東京駅"
},
{
"title": "確認",
"value": "はい"
}
]
}
*/
const jsonString = e.postData.getDataAsString();
const body = JSON.parse(jsonString);
//スプレッドシートを指定
let datasheet = SpreadsheetApp.openById("スプレッドシートのURLを記載").getSheetByName('シート名');
//範囲を指定
let lastRow,lastCol
lastRow = datasheet.getLastRow();
lastCol = datasheet.getLastColumn();
let data = datasheet.getRange(2,1,lastRow-1,lastCol).getValues();
let json = [];
let check;
//質問で場合分け
if(body.item_name == "大カテゴリ"){
//forで配列を最初から最後まで
for(let i = 0;i < data.length;i++){
if(!json.includes(data[i][0])){
json.push(data[i][0])
}
}
} else if(body.item_name == "中カテゴリ"){
//SPALOから受け取った内容から大カテゴリで検索
let daikate = body.data.find((item) => item.title === '大カテゴリ');
daikate = daikate.value;
//forで配列を最初から最後まで
for(let i = 0;i < data.length;i++){//カテゴリがSPALOで取得されたカテゴリなら商品名をjsonにつっこむ
if(data[i][0] == daikate){
if(!json.includes(data[i][1])){
json.push(data[i][1])
}
}
}
}
//SPALOにデータを返す
let res = ContentService.createTextOutput();
res = res.setMimeType(ContentService.MimeType.JSON);
res = res.setContent(JSON.stringify(json));
return res
}
————————————————————————————————————————-
まとめ
これによってタスク管理はSPALOからもスプレッドシートから直接でも、好きな方法で行えるようになりました。期限日が近くなるとコミュニケーションツールのSlackのトークルームにアラートが飛ぶように連携もしています。また、期限日が過ぎているものに大してアラートもかけています。スプレッドシートからステータスを変えずに、スラックから「完了」スタンプを押すだけでスプレッドシート上のステータスを変更する仕組みをつけています。日々、「便利にしたい」のアイディアを形にし、業務改善に取り組んでいます。
新型コロナウィルス(COVIT-19)の流行により業務改善と向き合う企業も増えたと思います。弊社はもともと業務改善のツールを開発・販売する企業でしたが、業務の効率化を図るには様々な方法があります。今回はSPALOとスプレッドシートの連携でしたが、実際にタスク管理だけでSPALO、スプレッドシート、Slackの連携をしています。
複数のツールを連携させ、より効率化を!これもひとつの方法です!
是非参考になれば幸いです。