【GAS】申請フォームを送信すると承認者にメールが送られてその結果もスプレッドシートに反映したかった


概要

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 = '[email protected]'; //承認者メールアドレス        
  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});

}

以上。
あとはフォームの内容とかフローによって臨機応変で。

自分の作業メモもかねてあっぷ

参考

備品購入申請フォームをGoogleフォームで作成する方法