#概要
1.googleフォームから申請
2.承認者にメールが届く
3.承認者が承認/却下を押す
4.申請の内容がスプレッドシートに反映される
5.申請者にも承認/却下の結果がメールで送信される
#経緯
申請者がフォームで送り、スプレッドシートに反映される。
ここまでは良い。
そこから申請者は承認者に連絡をして、承認者はスプレッドシートを確認して、承認/却下の判断を申請者に伝える。
という、非効率が行われていたため
#実装
今回もコピペさせていただきました。
いつもお世話になっております。
備品購入申請フォームをGoogleフォームで作成する方法
以下をウェブアプリケーションとして公開
gas
function doGet(e) {
const row = e.parameter.row;
const sheet = SpreadsheetApp.getActiveSheet();
const values = sheet.getRange(row, 1, 1, 14).getValues()[0];//承認/却下を入力する行番号
const bodies = generateBodies(values);
const answer = e.parameter.answer;
const result = {
ok: '承認',
ng: '却下'
};
sheet.getRange(row, 14).setValue(result[answer]);//ここの行番号も注意
const recipient = bodies.email;
const subject = `申請${result[answer]}のお知らせ`;
let body = '';
body += `以下の申請が${result[answer]}されました。\n\n`;
body += bodies.plain;
let html = '';
html += `<h1>申請${result[answer]}のお知らせ</h1>`;
html += `<p>以下の申請が${result[answer]}されました。</p>`;
html += bodies.html;
GmailApp.sendEmail(recipient, subject, body, {htmlBody: html});
html = '';
html += `<h1>申請の${result[answer]}</h1>`;
html += `<p>あなたは以下の申請を${result[answer]}しました</p>`;
html += bodies.html;
return HtmlService.createHtmlOutput(html);
}
以下のスクリプトを設置して、トリガーも「フォーム送信時」で設定
gas
function generateBodies(values){
const [timeStamp, email, name, department, channel, section, item, price, amount, way, reason, deadline, remarks] = values;//フォームから出力されたカラム名たち
const total = price * amount;
let plain = '';//送信したい内容
plain += `・申請者: ${name}\n`;
plain += `・部署: ${department}\n`;
plain += `・品名: ${item}\n`;
plain += `・単価: ${price} 円\n`;
plain += `・数量: ${amount}\n`;
plain += `・総額: ${total} 円\n\n`;
plain += `・購入方法: ${way}\n`;
plain += `・購入理由: ${reason}\n`;
plain += `・期日: ${deadline}\n`;
plain += `・備考: ${remarks}\n\n`;
let html = '<ul>';
html += `<li>申請者: ${name}</li>`;
html += `<li>部署: ${department}</li>`;
html += `<li>品名: ${item}</li>`;
html += `<li>単価: ${price}円</li>`;
html += `<li>数量: ${amount}</li>`;
html += `<li>総額: ${total}円</li>`;
html += `<li>購入方法: ${way}</li>`;
html += `<li>購入理由: ${reason}</li>`;
html += `<li>期日: ${deadline}</li>`;
html += `<li>備考: ${remarks}</li>`;
html += '</ul>';
return {
email: email,
plain: plain,
html: html
};
}
function sendMessage(e) {
const row = e.range.getRow();
const sheet = e.range.getSheet();
sheet.getRange(row, 14).setValue('確認中');
const bodies = generateBodies(e.values);
let url = 'https://script.google.com/a/~~'; //公開したウェブアプリケーションのURL
url += `?row=${row}&answer=`;
const recipient = 'hogehoge@gmail.com'; //承認者メールアドレス
const subject = '申請のお知らせ';
let body = '';
body += '申請がありました。\n\n';
body += bodies.plain;
body += '承認する場合は、以下URLをクリックしてください\n';
body += url + 'ok';
body += '却下する場合は、以下URLをクリックしてください\n';
body += url + 'ng';
let html = '';
html += '<h1>申請のお知らせ</h1>';
html += '<p>以下の申請がありました。</p>';
html += bodies.html;
html += `<p>承認する場合は、<a href="${url}ok">[承認]</a>をクリックしてください</p>`;
html += `<p>却下する場合は、<a href="${url}ng">[却下]</a>をクリックしてください</p>`;
GmailApp.sendEmail(recipient, subject, body, {htmlBody: html});
}
以上。
あとはフォームの内容とかフローによって臨機応変で。
自分の作業メモもかねてあっぷ