備忘録

diyReply(Ver1.3.0)

  1. function diyReply(SheetNo) {
  2.   //アクティブフォーム
  3.   const form = FormApp.getActiveForm();
  4.   //選択肢シート:SheetNoは必要なら変更する(一番左のシートが0、2番目が1、3番目が2、、、)
  5.   if(!(SheetNo>1)) SheetNo = 1;
  6.   const ss = SpreadsheetApp.openById(form.getDestinationId());
  7.   //フォームとリンクしている回答シート
  8.   const answerSheet = ss.getSheets()[0];
  9.   //返信メールのシート(2枚目のシート)
  10.   const mailSheet = ss.getSheets()[SheetNo];
  11.   //回答シートの最終行列
  12.   const lastRow = answerSheet.getLastRow();
  13.   const lastCol = answerSheet.getLastColumn();
  14.   //回答シートの最終行を配列に取得・返信メールのシートにセット
  15.   mailSheet.getRange(2,2,1,lastCol).setValues(answerSheet.getRange(lastRow,1,1,lastCol).getDisplayValues());
  16.   //メールシートの項目(セル:B3-B11)を配列に取得
  17.   const mailTbl = mailSheet.getRange('B3:B11').getDisplayValues().map(elm => elm[0]);
  18.   //FROM:(B11)が空白ならアクティブユーザーのメールアドレスにセット
  19.   if(!mailTbl[8]) mailTbl[8] = Session.getActiveUser().getEmail();
  20.   //OFF以外はメールを送信
  21.   if(mailTbl[0]!='OFF')
  22.     GmailApp.sendEmail(mailTbl[3],mailTbl[1],mailTbl[2],{from:mailTbl[8],cc:mailTbl[4],bcc:mailTbl[5],name:mailTbl[6],replyTo:mailTbl[7]});
  23. } //Ver1.3.0 for maintenance

このバージョンを使用の場合、次の点にご注意ください。

既存のフォームを修正変更し、改めて回答を募集する際は、過去のデータが混ざらないよう、リンクしたスプレッドシートとフォームの回答を全削除してください。(以下の①②の作業)

①回答シートの回答行を削除する。

②フォームの回答を削除する


diyReply(Ver3.1.0)

  1. function diyReply(SheetNo) {
  2.   // 引数SheetNo:設定用シートのタブの位置(一番左のシートが0、2番目が1、3番目が2…)
  3.   if(!(SheetNo > 1)) SheetNo = 1;
  4.   // アクティブフォーム
  5.   const form = FormApp.getActiveForm();
  6.   // 設定用シート(2枚目のシート)
  7.   const mailSheet = SpreadsheetApp.openById(form.getDestinationId()).getSheets()[SheetNo];
  8.   // 最新の回答を配列に取得
  9.   const latestItems = form.getResponses().pop();
  10.   const itemResponses = latestItems.getItemResponses();
  11.   // 全ての質問を取得し、SECTION_HEADERを除外
  12.   const allItems = form.getItems().filter(item => item.getType() !== FormApp.ItemType.SECTION_HEADER);
  13.   const answerItems = allItems.map(item => {
  14.     // 該当する質問に対する回答を探す
  15.     const tempRes1 = itemResponses.find(response => response.getItem().getId() === item.getId());
  16.     // 回答が存在すればその値、存在しなければ空白を設定
  17.     if(tempRes1) {
  18.       const tempRes2 = tempRes1.getResponse();
  19.       // 配列(チェックボックスの複数回答)の場合はカンマ区切りで結合
  20.       return Array.isArray(tempRes2) ? tempRes2.join(', ') : tempRes2;
  21.     } else {
  22.       return ''; // 未回答の場合は空白
  23.     }
  24.   });
  25.   answerItems.unshift(latestItems.getTimestamp()); // タイムスタンプを追加
  26.   // 回答を設定用シートにセット
  27.   mailSheet.getRange(2, 2, 1, answerItems.length).setValues([answerItems]); SpreadsheetApp.flush() // sync;sync;sync
  28.   // B12がONなら編集リンクを設定用シートにセット
  29.   mailSheet.getRange('C12').setValue(mailSheet.getRange('B12').getValue() === 'ON' ? latestItems.getEditResponseUrl() : ""); SpreadsheetApp.flush() // sync;sync;sync
  30.   // 設定用シートの項目(セル:B3-B11)を配列に取得
  31.   const mailTbl = mailSheet.getRange('B3:B11').getDisplayValues().flat();
  32.   // B11が空白ならアクティブユーザーのメールアドレスを使用
  33.   if(!mailTbl[8]) mailTbl[8] = Session.getActiveUser().getEmail();
  34.   // B3がOFF以外はメールを送信
  35.   if (mailTbl[0] !== 'OFF')
  36.     GmailApp.sendEmail(mailTbl[3], mailTbl[1], mailTbl[2], {from: mailTbl[8],cc: mailTbl[4],bcc: mailTbl[5],name: mailTbl[6],replyTo: mailTbl[7]});
  37. } // Ver3.1.0 for maintenance

すべての回答をフォームから取得し、スプレッドシートの回答に依存しない仕様です。そのため、セッションなどに対応できていません。

コメント

タイトルとURLをコピーしました