スキャナーの活用
スキャナーの活用
この記事でわかること
- 紙のおたよりをスキャンしてご家族に送る手間の解消法
- 複合機の「Scan to Cloud」機能の便利な使い方
- GAS(Google Apps Script)を活用した全自動送信の仕組み
- 【費用0円】無料ツールだけでシステムを構築できる理由
- 【知識不要】実はプログラムはAIに書かせたという裏話
ご利用者が通所先からおたよりを持ち帰ってくることがあります。大抵の場合、次回ご実家に帰るときに一緒に持って帰ってもらえば用が済むのですが、中には急ぎご家族にお知らせすべき内容もあります。
そんなときは、スキャナーでPDFにして、チャットやメールで「おたよりがありました。ご確認ください」と一言添えて送信するのですが、これがなかなかの手間😅。機械の操作に疎い職員にとっては、地味に苦痛な作業になっていました。
以前のフロー(地味に苦痛な作業)
紙のおたより
スキャナーを使って、
パソコンに取り込む
(操作がややこしい😭)
手動で文章作成
添付して送信
何とか簡易化できないか・・・🤔 そこで目をつけたのが「Scan to Cloud機能」です。格安のプリンターは別として、今の複合機のほとんどには、スキャンしたデータを直接クラウドにアップロードできるこの機能が搭載されています。
Googleドライブ上に利用者ごとのフォルダを作り、それぞれをスキャナーの宛先として登録しておきます。あとは、Aさんのおたよりをスキャンする際はAさん宛先を、Bさんのおたよりのときは Bさん宛先を選ぶだけで、それぞれのフォルダに格納されます。
Scan to Cloudの仕組み
複合機
宛先を選ぶだけ
そして、ここからがGASの出番です。
Aさん、Bさん、Cさん、Dさん・・・各フォルダに新しいデータが格納されたら、それをチャットやメールでご家族に自動送信する仕組みを作ればよいのです。
その際、各利用者の名前(◯◯さん)と通所先(✕✕事業所)の一覧をスプレッドシートで作成しておけば、スキャンデータが送られると同時に、
お世話になっております。
本日、✕✕事業所よりおたよりが届いています。
取り急ぎデータで送信いたします。ご確認くださいませ。
という定型文も自動で送ることができます。
| フォルダ名 | フォルダID | 宛先 | 最終確認日時 | 通所先名 |
|---|---|---|---|---|
| Aさん | 1a2B3c4D5e6F7g... | family-a@example.com | 2026/07/02 10:15:00 | ✕✕事業所 |
| Bさん | 9Z8y7X6w5V4u3T... | https://chat.googleapis.com/... | 2026/07/02 09:30:12 | △△デイサービス |
| Cさん | xXyYxXyYxXyYxX... | family-c@example.com | 2026/07/01 17:45:33 | ✕✕事業所 |
ちなみに…
弊社では利用していませんが、ご家族との通信手段にLINEをお使いの場合でも、対応は可能のようです。
GASによる全自動送信フロー
データ格納
GAS実行
ご家族へ自動送信
初期費用 0円 & ランニングコスト 0円!
GoogleドライブもGAS(Google Apps Script)も、Googleアカウントがあればすべて無料で利用できます。
高額なシステムを導入しなくても、今ある複合機と無料ツールを組み合わせるだけで、ここまで業務を自動化できちゃうんです。
実はこのプログラム、私は一文字も書いていません!
「プログラミングなんて分からない…」という方もご安心を。このGASのコード、実はAIに「こういうことがしたいから、コード書いて」と依頼して作ってもらったものなんです。
専門的なIT知識がなくても、AIをアシスタントとして活用すれば、このような業務改善システムを誰でも簡単に作れてしまう時代です!
以前の手作業が嘘のように、今はスキャン時に宛先フォルダを選ぶだけで完結します。
だいぶ楽になりました! 気軽にご家族に送れるようになったことで送信頻度も増え、ご家族様からも喜ばれています。
【大公開!】実際のスクリプトをお見せします!(コピー&ペーストですぐに使える!)
/* 実際に稼働しているGASのコード */
/**
* Googleドライブの各フォルダを監視し、新着ファイルがあれば
* Google Chat または メールで通知を送るスクリプト(複数宛先・混合対応版)
*/
// スプレッドシートのURLに含まれるID(d/ と /edit の間の文字列)を直接指定します
const SPREADSHEET_ID = 'ここにスプレッドシートのIDを入れます'; // ★実際のIDからダミーに変更しました
const SHEET_NAME = 'シート1';
function checkNewFiles() {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = ss.getSheetByName(SHEET_NAME);
const data = sheet.getDataRange().getValues();
console.log("監視処理を開始します...");
// 1行目は見出し(フォルダ名, フォルダID, 宛先, 最終確認日時, 通所先名)
for (let i = 1; i < data.length; i++) {
const folderName = data[i][0];
const folderIdRaw = data[i][1];
const recipientsRaw = data[i][2];
// D列(最終確認日時)を取得
const lastCheck = data[i][3] ? new Date(data[i][3]) : new Date("2000/01/01");
// E列(通所先名)を取得
const facilityName = data[i][4] || "通所先";
if (!folderIdRaw || !recipientsRaw) {
console.log(`行 ${i + 1}: フォルダIDまたは宛先が空のためスキップします。`);
continue;
}
const folderId = folderIdRaw.toString().trim();
const recipients = recipientsRaw.toString().split(/[ ,;、,;\n]+/).filter(Boolean);
try {
console.log(`フォルダ「${folderName}」をチェック中... (前回確認: ${lastCheck.toLocaleString()})`);
let folder;
try {
folder = DriveApp.getFolderById(folderId);
} catch (err) {
console.error(`フォルダ「${folderName}」へのアクセスに失敗しました: ${err.toString()}`);
continue;
}
const files = folder.getFiles();
let newFilesFound = [];
while (files.hasNext()) {
const file = files.next();
const createdTime = file.getDateCreated();
if (createdTime.getTime() > lastCheck.getTime()) {
newFilesFound.push({
name: file.getName(),
url: file.getUrl()
});
}
}
if (newFilesFound.length > 0) {
console.log(`=> 【${folderName}】新着ファイルを ${newFilesFound.length} 件発見しました。通知を送信します。`);
recipients.forEach(recipient => {
sendNotification(folderName, facilityName, recipient.trim(), newFilesFound);
});
} else {
console.log(`=> 【${folderName}】新着ファイルはありませんでした。`);
}
// 新着ファイルの有無に関わらず、チェックが完了したらD列(4列目)の時刻を更新する
sheet.getRange(i + 1, 4).setValue(new Date());
} catch (e) {
console.error(`フォルダ「${folderName}」(ID: ${folderId}) の処理中に予期せぬエラーが発生しました: ${e.toString()}`);
}
}
console.log("監視処理が完了しました。");
}
/**
* 宛先に応じてGoogle Chatまたはメールで通知を飛ばす
*/
function sendNotification(folderName, facilityName, recipient, fileList) {
const fileDetails = fileList.map(f => `📄 ファイル名: ${f.name}\n🔗 リンク: ${f.url}`).join('\n\n---\n\n');
// 指定されたメッセージ形式(誰宛か分かるように folderName を追加し、facilityName はE列から取得)
const message = `【${folderName} さん宛】\nお世話になっております。\n本日、${facilityName}よりおたよりが届いています。\n取り急ぎデータで送信いたします。ご確認くださいませ。\n\n${fileDetails}`;
try {
if (recipient.startsWith('http')) {
sendToGoogleChat(recipient, message);
} else if (recipient.includes('@')) {
MailApp.sendEmail({
to: recipient,
subject: `【新着通知】${facilityName}よりおたよりが届きました (${folderName}さん宛)`,
body: message
});
}
} catch (e) {
console.error(`送信エラー (${recipient}): ${e.toString()}`);
}
}
/**
* Google Chat Webhook 送信(リトライ機能付き)
*/
function sendToGoogleChat(url, text) {
const payload = JSON.stringify({ text: text });
const options = {
method: 'post',
contentType: 'application/json',
payload: payload,
muteHttpExceptions: true
};
for (let n = 0; n < 3; n++) {
const response = UrlFetchApp.fetch(url, options);
const code = response.getResponseCode();
if (code === 200 || code === 201) {
return;
}
console.log(`送信リトライ中... (ステータス: ${code})`);
Utilities.sleep(2000);
}
}

