⚙️ 初回設定:Googleスプレッドシート連携(管理者のみ)
② メニュー「拡張機能」→「Apps Script」を開く
③ 下記のコードを貼り付けて「保存」→「デプロイ」→「新しいデプロイ」
種類:ウェブアプリ、アクセス:全員
// ▼ 通知先メールアドレス(変更する場合はここを書き換え)
const NOTIFY_EMAIL = 'ohtaofg@gmail.com';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
// ── 悪用対策1:送信回数制限(1時間30件・短期100件まで) ──
const cache = CacheService.getScriptCache();
const nowD = new Date();
const hourKey = 'cnt_h_' + Utilities.formatDate(nowD, 'Asia/Tokyo', 'yyyyMMddHH');
const dayKey = 'cnt_d_' + Utilities.formatDate(nowD, 'Asia/Tokyo', 'yyyyMMdd');
const hCnt = parseInt(cache.get(hourKey) || '0') + 1;
const dCnt = parseInt(cache.get(dayKey) || '0') + 1;
cache.put(hourKey, String(hCnt), 3600);
cache.put(dayKey, String(dCnt), 21600);
if (hCnt > 30 || dCnt > 100) {
return ContentService.createTextOutput(JSON.stringify({ status: 'rate_limited' }))
.setMimeType(ContentService.MimeType.JSON);
}
// ── 悪用対策2:不正データの拒否 ──
if (!data.customer_name || String(data.customer_name).length > 100) {
return ContentService.createTextOutput(JSON.stringify({ status: 'invalid' }))
.setMimeType(ContentService.MimeType.JSON);
}
if (data.estimate_html && String(data.estimate_html).length > 500000) {
return ContentService.createTextOutput(JSON.stringify({ status: 'too_large' }))
.setMimeType(ContentService.MimeType.JSON);
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// ヘッダー行を初回作成
if (sheet.getLastRow() === 0) {
sheet.appendRow(['見積書No.','日時','操作','お客様名','お客様メール','合計金額','配送先','支払い方法','見積内容']);
}
// 連番管理シートを取得または作成
let seqSheet = ss.getSheetByName('連番管理');
if (!seqSheet) {
seqSheet = ss.insertSheet('連番管理');
seqSheet.appendRow(['最終No.']);
seqSheet.appendRow(['00000000']);
}
// 今日の日付プレフィックス(例: 20260322)
const pad = n => String(n).padStart(2,'0');
const d = new Date();
const datePrefix = d.getFullYear() + pad(d.getMonth()+1) + pad(d.getDate());
// 端末側で採番済みの場合はその番号を使用
let estimateNo = data.estimate_no;
if (!estimateNo) {
const lastNo = String(seqSheet.getRange('A2').getValue());
const lastPrefix = lastNo.slice(0, 8);
const seq = (lastPrefix === datePrefix) ? parseInt(lastNo.slice(8)) + 1 : 1;
estimateNo = datePrefix + pad(seq);
seqSheet.getRange('A2').setValue(estimateNo);
}
// 見積データを記録(印刷・メール送信どちらも記録される)
sheet.appendRow([
estimateNo, data.datetime, data.action || '', data.customer_name,
data.customer_email || '', data.total_amount, data.pref, data.payment, data.items
]);
// 見積書PDFを作成(メール送信時のみHTMLが送られてくる)
let pdf = null;
if (data.estimate_html) {
try {
pdf = Utilities.newBlob(data.estimate_html, 'text/html', 'estimate.html')
.getAs('application/pdf')
.setName('御見積書_No' + estimateNo + '_太田製作所.pdf');
} catch (err) {
console.error('PDF作成失敗: ' + err);
}
}
// お客様へPDF添付メールを送信(メール送信操作のとき)
if (data.action === 'メール送信' && data.customer_email && pdf) {
try {
MailApp.sendEmail({
to: data.customer_email,
subject: '【御見積書 No.' + estimateNo + '】合同会社 太田製作所',
body: data.mail_body || '御見積書を添付いたします。ご確認ください。\n\n合同会社 太田製作所',
attachments: [pdf],
name: '合同会社 太田製作所'
});
} catch (err) {
console.error('お客様宛メール送信失敗: ' + err);
}
}
// 通知メールを送信(印刷・メール送信どちらの操作でも通知)
try {
const subject = '【見積書発行 No.' + estimateNo + '】' + (data.action || '') + ' - ' + data.customer_name + ' 様';
const body =
'見積書が発行されました。\n\n' +
'見積書No.:' + estimateNo + '\n' +
'操作 :' + (data.action || '-') + '\n' +
'日時 :' + data.datetime + '\n' +
'お客様名:' + data.customer_name + ' 様\n' +
'お客様メール:' + (data.customer_email || '-') + '\n' +
'合計金額:' + data.total_amount + '\n' +
'配送先 :' + data.pref + '\n' +
'支払い :' + data.payment + '\n' +
'見積内容:' + data.items + '\n';
MailApp.sendEmail({
to: NOTIFY_EMAIL,
subject: subject,
body: body,
attachments: pdf ? [pdf] : [],
name: '見積もりアプリ'
});
} catch (err) {
console.error('通知メール送信失敗: ' + err);
}
return ContentService.createTextOutput(
JSON.stringify({ status: 'ok', estimate_no: estimateNo })
).setMimeType(ContentService.MimeType.JSON);
}
④ デプロイ後に表示される「ウェブアプリのURL」を貼り付け
📋 URLの貼り付け方
1. 上のコードをGoogleスプレッドシートに貼り付けて保存したら、
画面上のメニューから「拡張機能」→「Apps Script」を開きます
2. 右上の「デプロイ」ボタンをクリック →「新しいデプロイ」を選びます
3. 「種類の選択」で「ウェブアプリ」を選び、
「アクセスできるユーザー」を「全員」にして「デプロイ」ボタンを押します
4. 「ウェブアプリのURL」という欄に長いURLが表示されます
5. そのURLをすべて選択してコピー(Ctrl+A → Ctrl+C)し、
下の入力欄に貼り付けて(Ctrl+V)「設定を保存する」を押してください
✅ 保存後の使い方
6. 「設定を保存する」を押すと「Googleスプレッドシート連携済み ✅」と表示されます
7. 商品を選んで宛名を入力したら「🖨️ 見積書を印刷する」か「📧 メールで送信する」を押してください
8. 印刷・送信すると自動的にGoogleスプレッドシートに見積内容が記録されます
(見積番号も自動で採番されます)
⚠️ うまくいかないときは?
・URLが間違っている場合はエラーが出ます。「再設定」ボタンを押してURLを入れ直してください
・デプロイのときに「アクセスできるユーザー」を「全員」にしていないと動きません
✅ Googleスプレッドシート連携済み
宛名(お客様名)
送信先メールアドレス(必須)
印刷・送信時に見積内容が太田製作所へ自動保存されます