6
5

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 1 year has passed since last update.

【業務効率化】Google Formの回答結果を自動的にPDFで個別返信をやってみた!!

Last updated at Posted at 2023-03-27

やろうとしたこと

今まで、Google Formから集計した結果をシートにすることはありますが、分析結果は個別でまた送信することが多く、今回は回答者が記入した回答に対して、分析結果を自動送信する仕組みをやってみました。

なんでやり始めたのか?

今までの作業:
Google Formから自動転記した答えを手動で転記
→転記したデータをPDFにし
→メールで返信

一連の流れ、一人のお客さんに対して、5分ほどかかります。
手作業を減らすことによって、ヒューマンエラーをなくし、より分析の方に力を入れると予想。

具体的にやったこと

Google Formから Apps Script経由で、回答と分析結果をあらかじめspreadsheetに記載し、
その結果を自動的にPDFにして、ドライブ保存した後に、メールに添付して自動送信。

1. スプレットシートの型を設定

回答ごとに分析結果を右側に記載します。

スクリーンショット 2023-03-27 19.13.28.png

今回は TIMESTAMPを表示させないように、
headerRowresponseRowを[1]からスタートしました。
(GOOGLE FORMのデフォルトでは、TIMESTAMPが[0]番目です。)

function createIndividualAnalysisSheet(email, responseRow, headerRow) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "分析結果_" + email;
  var individualSheet = ss.getSheetByName(sheetName);

  if (!individualSheet) {
    individualSheet = ss.insertSheet(sheetName);
  }

  // 固定コンテンツを設定
  var fixedContent1 = "質問1の分析結果";
  var fixedContent2 = "質問2の分析結果";

  // 回答者名を転記
  individualSheet.appendRow(["回答者", email]);

  // 質問1とその回答、固定コンテンツ1を転記
  individualSheet.appendRow([headerRow[1], responseRow[1], fixedContent1]);

  // 質問2とその回答、固定コンテンツ2を転記
  individualSheet.appendRow([headerRow[2], responseRow[2], fixedContent2]);

  // 質問3以降とその回答を転記
  // for (var i = 3; i < headerRow.length; i++) {
  //   individualSheet.appendRow([headerRow[i], responseRow[i]]);
  // }

  // 空行を追加
  individualSheet.appendRow(["", ""]);

  return individualSheet;
}

2 回答結果をPDFに作成

回答結果をPDFに出力して、GOOGLEドライブに保存。
folderId を指定すれば、指定フォルダにPDFファイルを保存できます。

function createPdfFromSheet(sheet, fileName) {
  var ss = sheet.getParent();

//出力フォーマット設定
  var url = 'https://docs.google.com/spreadsheets/d/' + ss.getId() + '/export?';
  var exportOptions = 'exportFormat=pdf&format=pdf' + // pdf format
    '&size=letter' + // paper size
    '&portrait=true' + // orientation, false for landscape
    '&fitw=true' + // fit to width, false for actual size
    '&sheetnames=false&printtitle=false' + // hide optional headers and footers
    '&pagenumbers=false&gridlines=false' + // hide page numbers and gridlines
    '&fzr=false' + // do not repeat row headers (frozen rows) on each page
    '&gid=' + sheet.getSheetId(); // the sheet's Id

  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url + exportOptions, {
    headers: {
      'Authorization': 'Bearer ' + token
    }
  });

  var pdfBlob = response.getBlob().setName(fileName);

  // フォルダーのIDを指定
  var folderId = "ドライブのフォルダID";
  var folder = DriveApp.getFolderById(folderId);

  var pdfFile = folder.createFile(pdfBlob);

  return pdfFile;
}

3.回答結果をPDFファイルで添付して、メールから送信

・ドライブに保存したPDFファイルを添付して、メール送信

function sendEmailToRespondent(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var responseSheet = e.range.getSheet();
  var formResponses = responseSheet.getDataRange().getValues();
  var headerRow = formResponses.shift();
  var responseRow = formResponses[e.range.getRow() - 2];

  // メールアドレスと回答内容を取得
  var emailAddressIndex = headerRow.indexOf("メールアドレスを記入してください"); // メールアドレスの質問の列を指定(今回は1番目の質問です。)
  var emailAddress = responseRow[emailAddressIndex];


  // PDFファイルを作成
  var pdfFile = createPdfFromSheet(individualAnalysisSheet, "回答結果_" + emailAddress + ".pdf");

  // メールの件名と本文を作成
  var subject = "アンケートの回答と分析シート";
  var message = "以下はあなたが提出したアンケートの回答です。\n\n";

  // 回答内容を本文に追加
  for (var i = 0; i < headerRow.length; i++) {
    message += headerRow[i] + ": " + responseRow[i] + "\n";
  }

  // // 分析シートのURLを本文に追加
  // var analysisSheetUrl = ss.getUrl() + "#gid=" + individualAnalysisSheet.getSheetId();
  // message += analysisSheetUrl;

  // PDFファイルを添付してメールを送信
  var attachments = [pdfFile.getAs(MimeType.PDF)];
  MailApp.sendEmail(emailAddress, subject, message, { attachments: attachments });
}

4 トリガーの設置

Apps Scriptを動いてくれるためのトリガーです。

function setUpTrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger("sendEmailToRespondent")
    .forSpreadsheet(ss)
    .onFormSubmit()
    .create();
}

5. scriptを起動

送信ボタンを押すと、上記のscriptを起動させる仕組みです。

function onFormSubmit(e) {
  var email = e.values[1]; // メールアドレスが格納されている列を指定
  var individualSheet = createIndividualAnalysisSheet(email, e.values, e.namedValues);

  // PDFを生成し、Google Driveに保存
  var fileName = "分析結果_" + email;
  var pdfFile = createPdfFromSheet(individualSheet, fileName);

  // メールでPDFを送信
  var subject = "アンケート分析結果";
  var body = "こちらがあなたのアンケート分析結果です。";
  var attachments = [pdfFile.getAs(MimeType.PDF)];
  MailApp.sendEmail(email, subject, body, { attachments: attachments });
}

6. 結果

GOOGLEフォームを回答したら、ちゃんとメールとPDFが来ました(歓喜!!!)

スクリーンショット 2023-03-27 19.21.36.png

まとめ

ファイルを添付して、送信する手間がなくなりましたので、効率よく他の業務に集中できました。処理時間を減らすことによって、お客さんも返信への待ち時間を減らせます。喜んでくれると嬉しいです ^^

細かいことはまだ書けてませんので、これからブラッシュアップしていきたいと思いますので、ご意見、コメント、お待ちしておいます。

6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?