導入:AI作業自動化!LINEで見積もりと日程調整を完全無人化
お疲れ様です!横浜で清掃業を営んでいる、49歳のYasuです。
前回はAI初心者でもできる!長文翻訳&Kindle出版の自動化アプリを作りましたね。
毎日現場からヘトヘトになって帰宅した後、LINEに届いたお客様からの問い合わせ写真を見て、手作業で見積もりを計算し、カレンダーと睨めっこしながら「〇日はいかがですか?」と返信する……このコピペ作業、本当に大変じゃないですか?
本記事では、Dify(AI構築ツール)とGASを連携させ、お客様がLINEで汚れの写真を送るだけで、AIが清掃箇所と汚れを分析し、Googleカレンダーの空き日程まで確認して数十秒で自動返信するシステムの作り方を徹底解説します。
同世代の清掃業主である私が、実体験から「AI初心者が必ず落ちる3つの罠」とその突破法まで丁寧に紹介しますので、これを読めば帰宅後にゆっくり過ごせる圧倒的な自由時間が手に入ります!
結論:3つのツール連携で「自動接客ロボット」が完成
今回の自動化は、まるでDifyが「ベテラン営業マン」として見積もりを考え、GASが「店長」としてLINE(受付)とカレンダー(予約帳)を繋ぐ、3段階リレーのような仕組みです。
難しそうに感じるかもしれませんが、全て私の用意したコードを順番にコピペ&クリックするだけです。ITに不慣れな中高年のあなたも、すぐに使いこなせるようになります!
手順:Dify×GAS×LINEで作る自動見積もりボット
STEP 1:GASで「AI店長」の受付窓口を作る
まずは、LINEから写真を受け取り、AIへ届けるプログラムを用意します。 GAS(Google Apps Script)を使って、管理画面の裏で自動プログラムが動きます。(GASはGoogleが提供するWeb自動化ツールで、中学生でもコピペで利用可能です)
- Googleドライブから「Google Apps Script」を新規作成します。
- 以下のコードをすべてコピペし、一番上の3つの鍵(LINE、Dify、カレンダーID)をご自身のものに書き換えてください。
▼ コピペ用:GAS連携コード(全行に丁寧な解説付き!)
JavaScript
// 【設定部分】3つの重要なカギとIDをここに貼り付けます
const LINE_TOKEN = "ここにLINEのアクセストークンを貼ります";
const DIFY_API_KEY = "ここにDifyのAPIキーを貼ります";
const CALENDAR_ID = "あなたのGoogleカレンダーID(またはGmailアドレス)";
// お客様がLINEでメッセージや写真を送った時に動くメインのプログラムです
function doPost(e) {
// LINEから送られてきたデータ(JSON)をプログラムが読める形に変換します
const json = JSON.parse(e.postData.contents);
const event = json.events[0];
const replyToken = event.replyToken;
const message = event.message;
// もし送られてきたのが「写真(image)」だった場合の処理です
if (message.type === "image") {
// 【手順1】Googleカレンダーを見て、直近7日間の「すでに埋まっている予定」をメモします
const scheduleMemo = getScheduleMemo();
// 【手順2】LINEから画像の実際のデータをダウンロードします
const imageBlob = getImageFromLine(message.id);
// 【手順3】ダウンロードした画像をDifyへアップロードします
const fileId = uploadImageToDify(imageBlob);
// 【手順4】AIへの指示文です。ここが超重要!
const userMessage = "送られた画像を分析し、清掃箇所と汚れ具合の見積もりと、最短でいつ来れるか日程を教えてください。";
// AIにお返事を作ってもらいます
const aiResponseText = getDifyResponse(fileId, userMessage, scheduleMemo);
// 【手順5】完成したお返事を、お客様のLINEへ送信します
replyToLine(replyToken, aiResponseText);
} else {
replyToLine(replyToken, "お見積りと日程調整をします!まずは清掃したい箇所の「写真」を送ってくださいね!");
}
return ContentService.createTextOutput("OK");
}
// ▼▼ ここから下は裏方のプログラム(関数)です ▼▼
function getScheduleMemo() {
const calendar = CalendarApp.getCalendarById(CALENDAR_ID);
const today = new Date();
const nextWeek = new Date();
nextWeek.setDate(today.getDate() + 7);
const events = calendar.getEvents(today, nextWeek);
let memo = "【現在の予約で埋まっている日時】\n";
if (events.length === 0) return memo + "現在はすべての日程が空いています。\n";
for (let i = 0; i < events.length; i++) {
let title = events[i].getTitle();
let startTime = Utilities.formatDate(events[i].getStartTime(), "JST", "M/d HH:mm");
let endTime = Utilities.formatDate(events[i].getEndTime(), "JST", "HH:mm");
memo += startTime + " - " + endTime + " (" + title + ")\n";
}
return memo;
}
function getImageFromLine(messageId) {
const url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content";
const options = { "method": "get", "headers": { "Authorization": "Bearer " + LINE_TOKEN } };
return UrlFetchApp.fetch(url, options).getBlob();
}
function uploadImageToDify(blob) {
const url = "https://api.dify.ai/v1/files/upload";
const options = {
"method": "post",
"headers": { "Authorization": "Bearer " + DIFY_API_KEY },
"payload": { "file": blob, "user": "line_user" }
};
const response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText()).id;
}
function getDifyResponse(fileId, userMessage, scheduleMemo) {
const url = "https://api.dify.ai/v1/chat-messages";
const combinedQuery = "【お客様の要望】\n" + userMessage + "\n\n" + scheduleMemo;
const payload = {
"inputs": {},
"query": combinedQuery,
"response_mode": "blocking",
"conversation_id": "",
"user": "line_user",
"files": [{ "type": "image", "transfer_method": "local_file", "upload_file_id": fileId }]
};
const options = {
"method": "post",
"headers": { "Authorization": "Bearer " + DIFY_API_KEY, "Content-Type": "application/json" },
"payload": JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText()).answer;
}
function replyToLine(replyToken, text) {
const url = "https://api.line.me/v2/bot/message/reply";
const payload = { "replyToken": replyToken, "messages": [{ "type": "text", "text": text }] };
const options = {
"method": "post",
"headers": { "Authorization": "Bearer " + LINE_TOKEN, "Content-Type": "application/json" },
"payload": JSON.stringify(payload)
};
UrlFetchApp.fetch(url, options);
}
STEP 2:DifyにAIライターを作成する(プロンプト設定)
次に、Difyで画像を分析するAI営業マンを作ります。
- Difyで「チャットボット(基本)」を作成し、Vision(画像認識)モデルをONにします。
- プロンプト(手順)に以下をコピペします。
あなたは清掃業のプロフェッショナルで、優秀な営業担当です。 お客様から「清掃希望箇所の画像」が送られてきます。 以下の手順で、お客様へのお返事を作成してください。
- まず、送られた画像の内容を確認し、何(例:窓、エアコン、キッチン、トイレなど)を清掃したいのかを特定してください。
- 特定した清掃箇所について、画像から汚れの状況を分析し、概算のお見積り金額(例:窓ガラス清掃なら中度のカビ汚れで3,000円〜5,000円など)を提示してください。
- 「現在の予約状況(すでに埋まっている予定)」を読み解き、被らない【直近の空き日程の候補を3つ】提案してください。
- 親切で丁寧なトーンで出力してください。

STEP 3:私が丸一日を溶かした3つの罠と解決法
このシステムを作る際、49歳IT未経験の私は見事に3つの罠にハマり、丸一日を溶かしました。皆さんは以下の方法でサクッと回避してください!
- 罠①:GASの更新忘れ(バージョン1の呪縛) APIキーを正しいものに書き換えても、LINE側で「エラー401」が出る事件が発生。GASは保存しただけでは反映されません!必ず**「デプロイ」>「デプロイを管理」>「新バージョン」**を選んで上書き保存してください。
- 罠②:LINE初期ロボットの干渉 AIが返事をしたのに、同時に「個別のお問い合わせを受け付けておりません」という自動メッセージが……。LINE公式アカウント管理画面の「応答設定」から、**「応答メッセージ」を必ず【オフ】**にしましょう。
- 罠③:AIの思い込みバイアス(全部エアコン事件) 窓の写真を送ったのに「エアコンですね」と返ってくるトラブル。原因は私がGASの指示文に「エアコンの見積もりを…」と書いていたからでした。指示書は必ず**「画像を分析し、清掃箇所を特定して」と一般化**することが超重要です!

まとめ:50代・AI初心者でもビジネスの完全自動化はできる!
同世代の皆さん、諦めずに一緒に挑戦しましょう! 毎度何らかのエラー画面と格闘し、直しては次のエラーに出くわしたりとすんなりいかないですが
なんとか生成できてます。皆様もこういうアプリを作って
私たちの腕でカバーし、面倒な顧客対応や見積もり作成はAIに任せて、どんどん自動化を進めていきましょう!
👇 次のアクションはこちら! 「ブログ記事の作成も自動化したい!」という方は、以下の関連記事でWordPressへの完全自動投稿システムの作り方をマスターしてくださいね! 👉 【関連記事】WordPress AI記事自動投稿:Dify×GASで完全自動化
この記事が役に立った!という方は、ぜひブラウザのブックマーク登録と、コメント欄へのメッセージをお待ちしております!一緒に「中年からのAI再スタート」を成功させましょう!
次回も作るアプリはこれから考えますが、是非お楽しみに!


コメント