連絡漏れを防げ！LINEBotで業務連絡共有ツールを作ろう！

# 「えっ、〇〇くんあと3日もおらんの？！」


おはようございます、こんにちは、こんばんは、
略して、おはこんばんちは、ずんです。
とある小売スーパーの、とある店舗の、とある部門で働いています。

うちの部門は私を含めて約20人ほど、店舗の各部門の中でも割と大所帯です。
構成も社員、パートさん、アルバイトさん、様々なメンバーがいます。
そして冒頭の見出しは、私がシフトを確認しながらよくバックヤードでこぼす独り言です。



### 業務連絡がなかなか伝わらない
現在私の所属してる店舗では、毎日のように朝礼・昼礼があり、そこで店舗の営業・管理に関わる様々な業務連絡が伝達されます。
この業務連絡の共有のため、うちの部門では連絡ノートにその内容を記入し、部門のバックヤードで誰でも確認できるよう掲示してあります。

…が、**そもそも店に来ないとこの連絡ノート、見られないです。**

なので出勤日数が少なく次の出勤まで数日期間が開いてしまうパートさんやアルバイトの皆さんには情報共有が遅くなってしまいます。

例えば、
**〇/〇までに〇〇〇を完了してください**
**〇/〇までに契約更新書類を事前に準備してください**
という連絡を余裕をもって出したとしても、人によっては完了が期限ギリギリ、または出勤してきたはいいけど必要な書類や提出物が揃ってなくていますぐ対処できず締め切りを過ぎてしまうことも…。

（そして、出勤してるのにこの連絡ノートをちゃんと読まない人もいます。**読めえええ！！！**）

しかし、そういう人たち全員に電話やメールでひとりひとり連絡を取っていると（またはひとりひとり捕まえてノートを読ませていると）、うちのような大所帯の部門では大変時間がかかります。

そこで、
**身近なツールを使って、全員が同じタイミングで情報共有ができないか**
と考え、今回このようなものを制作してみました。



# 業務連絡配信Bot

### このBotの特徴
+ LINEのメッセージ欄から日付を送ると、その日の業務連絡を返信する
+ 業務連絡がない日は「〇/〇の業務連絡はありません」と返信する
+ 毎日10:00頃に昨日の業務連絡の内容を自動で配信（この要素については後述します）

### 完成品はこちら

https://x.com/zunnzunn0210/status/1919967976943460515



### 使用したツールはこちら
+ LINEBot（[LINE Developers](https://developers.line.biz/ja/ "Make Home")）
+ [Make](https://www.make.com/en "Make")
+  [Googleスプレッドシート](https://workspace.google.com/intl/ja_jp/products/sheets/ "Googleスプレッドシート")
+ [SSSAPI](https://sssapi.app/ "SSSAPI")
+ [GAS](https://workspace.google.co.jp/intl/ja/products/apps-script/ "GAS")
+ [ChatGPT](https://openai.com/ja-JP/chatgpt/overview/ "ChatGPT")



# 製作過程



### 業務連絡用のスプレッドシートを作成

事前に、スプレッドシートでA、B、C列にそれぞれ日付、業務連絡、備考と記入したものを作成。
このB列の業務連絡の内容をLINEBotで配信します。

![spreadsheet1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/0b9e5d3a-8ad5-4dee-b208-5276b388f800.png)
（とりあえずテストのために、ダミーの業務連絡をいくつか入れてみました。）



### マブダチ、ChatGPT登場
ここで前回のプロダクト制作でマブダチになったChatGPTへお手伝いを依頼。
次のように条件を提示してみました。

![GPT1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/e64aaebb-34f4-4b72-920d-6e19ca3abccb.png)
![GPT2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/b33a2fff-185a-4b8b-aaa3-eb823a791ec4.png)

なんと分かりやすい…さすが私のデジタルの師匠です。
このあともひとつひとつステップを踏んで教えてくれました。



### スプレッドシートをSSSAPIでAPI化

ChatGPT師匠の指導のもと、進めていきます。
先ほど作った業務連絡のスプレッドシートをSSSAPIでAPI化します。

https://sssapi.app/

アカウントを作成し、API名を決めてスプレッドシートのURLを入れるだけで、サクッとAPI化できました。

![SSSAPI1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/13f5f1a9-dc65-4387-a061-bf5fd089059a.png)

<details><summary>ところでAPI化すると何がどう変わるの？</summary>

デジタル初心者の私、**そもそもスプレッドシートをそのまま使うのとAPI化するのって何が違うのだろう**という疑問が。
そんな疑問もChatGPT師匠におまかせ、説明してもらいました。

![GPT3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/87f35d10-9f4e-4bde-9371-5297ed2c4742.png)
![GPT4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/b7f27320-fa18-473b-afce-79a9f4823e84.png)

なるほど。読み取り専用だけど、URLだけでOK、アクセスも高速で軽くノーコードで扱える、という利点があるようです。
使い分けの例まで教えてくれました。
（このアドバイスから、SSSAPIとMakeでの制作をすすめていきました。）
</details>



### LINEBotとMakeで配信用Botを作る

Line Developersで配信用Botを作り、Makeでモジュールを組んでいきます。
モジュール全体はこのような感じです。

![make1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/d600c703-78e6-43ad-9846-cedc47239ee7.png)



<details><summary>各モジュールの設定内容</summary>

1\.先ほどSSSAPIでスプレッドシートをAPI化した際に発行されたAPI URLを使用してHTTPモジュールを設定し、JSONモジュールとつなげます。
![make2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/53e3541b-232a-4185-89cc-dcf7fe71caef.png)


2\.JSONモジュールからIteratorモジュールへつなぎ、IteratorモジュールとRのフィルター設定は、JSONの日付データの中からLINEのメッセージで受け取った日付と一致するものを選んで通す、という感じ）
![make3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/b25b5f91-c928-43e8-b2c6-9759ad160571.png)


3\.Routerモジュールで中継して、先ほど通された日付のデータからLINEBotの返信を業務連絡がある場合、ない場合に分けます。
![make4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/0f030827-7309-41e3-acf0-76f14f86e96e.png)


4\.LINEモジュールでLINEBotが返信する内容をそれぞれ設定して終了です。
![make5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/ac2139c1-f7d9-4c5d-a512-1ed6d691b80b.png)


</details>



### GASを使用して自動配信設定をつける

ここまでで、利用者が指定した日付を送ればその日付の業務連絡を返してくれるLINEBotができました。
しかしこのままだと**受動的**、つまり使う人が自らトーク画面で操作をしてくれないと情報の共有がされません。
（冒頭でもお話しした**連絡ノートを読まない人なんて絶対自主的には使わないでしょう。）**

そういえば、作り始める前にChatGPTがこんなことを言っていました。

![GPT5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/760998b3-9696-4e50-9b9c-0711925f29c2.png)

**送信補助**…これで自動配信の機能がつけられるかもしれない。

ということでChatGPTに方法を聞き、
    **毎日10:00頃に昨日の業務連絡の内容を自動で配信する**
という機能を付け加えるべく、GASで使用するコードの生成と、毎日定時に自動で配信する設定方法を教えてもらいました。


<details><summary>ChatGPTに書いてもらったコード</summary>

コードというものを扱ったことがない私。
生成されたコードを見ても何が何だかさっぱり分かりませんが、ChatGPT師匠が分かりやすく見出しや説明をつけて生成してくれました。
（それでも全貌は分かりませんが…）

```

// 日次で呼び出すメイン関数
function pushDailyUpdate() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("業務連絡");
  const now = new Date();
  
  // 昨日の日付を取得
  const yesterday = new Date(now);
  yesterday.setDate(now.getDate() - 1);
  const formattedYesterday = Utilities.formatDate(yesterday, "Asia/Tokyo", "yyyy/MM/dd");
  
  // スプレッドシートからデータを取得
  const data = sheet.getDataRange().getValues();

  // 昨日の日付を検索
  let message = "前日の業務連絡はありません";
  for (let i = 0; i < data.length; i++) {
    const date = Utilities.formatDate(new Date(data[i][0]), "Asia/Tokyo", "yyyy/MM/dd"); // A列の日付
    if (date === formattedYesterday) {
      message = data[i][1]; // B列の業務連絡内容
      break;
    }
  }

  // LINE Botにメッセージ送信
  sendMessageToUsers(message);
}

```
また、LINEBotがメッセージを不特定多数の利用者に送るには利用者のLINEユーザーIDが必要とのことだったので、最初に業務連絡を作成したスプレッドシートへ「userLogs」というシートを追加し、**利用者がメッセージを送信したときに自動でユーザーIDを取得しスプレッドシート内に追加、そのシート内のユーザーIDに対して一斉配信をする**という機能も追加してもらいました。


```

// userLogsシートのA列からuserId一覧を取得
function getUserIds() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('userLogs');
  if (!sheet) {
    Logger.log('userLogsシートが見つかりません');
    return [];
  }

  const data = sheet.getRange(1, 1, sheet.getLastRow()).getValues(); // A列
  return data.map(row => row[0]).filter(id => id && id !== 'userId');
}

// 指定したuserIdにメッセージを一斉送信
function sendMessageToUsers(message) {
  const userIds = getUserIds();

  userIds.forEach(userId => {
    const payload = {
      to: userId,
      messages: [
        {
          type: 'text',
          text: message
        }
      ]
    };

    const options = {
      method: 'post',
      contentType: 'application/json',
      headers: {
        Authorization: 'Bearer ' + LINE_ACCESS_TOKEN
      },
      payload: JSON.stringify(payload)
    };

    try {
      const res = UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', options);
      Logger.log('送信成功: ' + userId);
    } catch (e) {
      Logger.log('送信失敗: ' + userId + '\n' + e.message);
    }
  });
}


const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("業務連絡");
const data = sheet.getDataRange().getValues();  // 全データを取得

// 昨日の日付を "yyyy/MM/dd" 形式で取得
const today = new Date();
today.setDate(today.getDate() - 1);
const targetDate = Utilities.formatDate(today, "Asia/Tokyo", "yyyy/MM/dd");

let message = `【${targetDate}の業務連絡】\n見つかりませんでした。`;

for (let i = 1; i < data.length; i++) {
  const sheetDate = Utilities.formatDate(new Date(data[i][0]), "Asia/Tokyo", "yyyy/MM/dd");  // A列を日付として変換
  if (sheetDate === targetDate) {
    const businessUpdate = data[i][1];  // B列
    if (businessUpdate && businessUpdate.trim() !== "") {
      message = `【${targetDate}の業務連絡】\n${businessUpdate}`;
    }
    break;
  }
}

```

![spreadsheet2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/41869afa-9efa-4d3a-bfc5-3535c365b7e3.png)


一度メッセージを送ったところ、無事私のLINEユーザーIDが取得され、スプレッドシート内に追加されました。


</details>



ChatGPTが生成してくれたコードをGASのエディタに入力。
そして自動配信をするためのトリガーの設定をします。

![GAS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/313def7b-bb70-488a-9963-77164bedd699.png)

![GAS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/378e5191-958f-4c12-a9cd-7c4c212ebdaf.png)

GASのエディタ画面にある「実行」ボタンでテストして無事配信されたので、おそらく大丈夫だと思いますが、ちゃんと毎朝午前10:00ごろに自動配信されるでしょうか…。


LINE Developersの画面でBotの体裁を整えつつ、**ドキドキしながら翌日を待ちます。**

<details><summary>LINEBotを整える</summary>

![bot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/88cb1306-6778-4bfa-aec1-e33ec3b55788.png)
![bot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/72dee4a9-eaa5-4d44-bd39-2084dce31f97.png)
![bot3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/b1355442-acde-4675-9a7e-05903bd9ca60.jpeg)
こんな感じで設定したら、「らしい」見た目になりました！


</details>


### 翌日…

![bot4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061438/158734d4-41b5-45c6-935a-52a642b556f0.jpeg)


**ちゃんと来とる！！！やったー！！！**
配信の瞬間をとらえるのはさすがに無理でしたが、翌日のAM9:03にきちんと配信されました！


# みんなに見てもらった
せっかくなので、うちの部門で働くパートさんたち「ちょっと、こんなもの作ってみたんだけど…」と画面を操作しながら見てもらい、**もし実際に部門での業務連絡ツールとしてこのBotが導入されたら**、と想定して感想をもらいました。

### みんなの感想
+ 便利そう、使ってみたい
+ 日付を入れるだけなら簡単だから確認しやすいね
+ 連続で休んでしまったときは情報がなくて浦島状態になってしまうので、これは嬉しい

### こんな声もいただきました
+ **これって画像は配信できないの？**
　　　（これ、なんていいアイデアでしょう！そして実現できそう！）  
+ 〇〇さんとかは**LINEの通知切ってるから**、あの人には使えないかも…。
　　　（それはもう私も打つ手がありません…）
+ 聞いた話だけど、**今の若い子ってLINE使ってないらしいよ？**
　　　**（エッ、そうなの？！！）**


# 今後の課題

### 追加機能を付ける
今回は日付を送ることでその日の業務連絡の内容を送るというLINEBotを作りましたが、逆に「棚卸」や「全体朝礼」などの**業務内容にかかわるキーワードを送ると、スプレッドシート内で検索し、その業務を行う日付を返してくれる**というものも作れるかもしれません。
リマインド機能として使用できそうです。

そしてパートさんからの提案、**画像の送信**。これは大変いいアイデアです！
例えば「バックヤードのどこどこになになにが置いてあるので～」なんていう**業務連絡を写真付きで説明**できれば文章よりも分かりやすさがぐっと上がります。
単純にスプレッドシートのセル内に画像を挿入すれば対応するのでしょうか…？
これは是非試してみたい機能ですね。

### 複数のツールへの配信に対応
**「今の若い子ってLINE使ってないらしいよ？」**
衝撃でした。みんなに身近なツールとして「LINE」を選んだつもりだったのですが、**いまの若い子たちってLINE使わないの…？**
うちの部門で若い世代というと**大学生のアルバイトの子たち**です。パートさんたちの息子さん娘さん（おそらく私と同世代、つまりアラサー）はみんな使ってるそうですが…そっか、LINE使わない子もいるよね。私の見識が甘かったです。

ジェネレーションギャップをひしひしと感じますが、そうと分かれば対応を考えるしかありません。
若い子たちがどんなツールで連絡を取り合っているのかはそれぞれ違いがあるかもしれませんが、みんなが同じように情報共有できるようにするには、**LINE以外の様々なツールにも可能な限り対応**できるよう改善する必要があります。


### もしかして、GASで全部作れた？
デジタル初心者の私にはまだ全貌が分かりませんが、ChatGPTが生成してくれたコードと操作指示を見ていると、「ここにSSSAPIのURLを入れて…」や「ここにLINEBotのチャネルアクセストークンを入れて…」など、「あれ、これMakeのモジュール設定画面でも同じような操作しとるよな？」と思い、気付きました。

**そうか、コードを書くという操作をMakeではモジュールを足したりつなげたり、設定をつけたりすることで実現してるんだ…。**

**ノーコードってそういうことか！**

~~（気づくのが遅い気もします。）~~

英語に弱い私。ひとつシナリオを作るたびにモジュールの操作に四苦八苦しながら、英語にも四苦八苦しています。
でもChatGPTがコードを書いてくれるなら、そしてGASのような日本語で扱えるツールなら**もっと楽に作れたのでは？！**

そしてGASは他のGoogleツールとの連携も簡単にできます。
私の職場も業務中にGmailやGoogleドライブなどを頻繁に使用するので、GASを使い慣れていけば、そこからなにか業務改善の糸口がつかめるかもしれません。
これは**使いこなしたいぞ、GAS…！**



# 最後に
2回目の挑戦、LINEBotでのプロダクトでした。
前回は個人的に使いたいものを作りましたが、今回は業務改善、問題解決という視点から作ってみました。

ですがうちの会社、**業務上の連絡や会話をSNSや会社指定外のアプリケーションですることは禁止**されています。
セキュリティの問題や情報漏洩の危険性、また使用する個人のリテラシーにも差があるため、これは致し方なしですね…。
なのでせっかく作ったこのLINEBot、実際にうちの店舗や部門で使用することはできません。
（承知の上で作ってはいたのですが、いざ苦労して作り上げてみると**ちょっと切ない。**）

だけど、このさき会社で認可された連絡ツールがもし現れたら…。
**そのツールを使用していつか同じような仕組みを作れるかもしれません。**

そんな未来がくるまで、今回のこの記憶を脳みそにしっかり繋ぎ留めたいと思います。
（忘れたら、自分でもこの記事を見返しにこよう…。）