0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#概要
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});
 
}

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

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

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?