質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PhpSpreadsheet

PhpSpreadsheetは、PHPExcelの後継であるPHPライブラリです。新規Excelファイルの作成や既存Excelファイルの読み書き、ファイル編集など一連の操作を無償で行うことができます。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1219閲覧

GoogleFORM未提出者に毎朝8時に回答催促メールを自動で送りたい

Kimoty

総合スコア13

PhpSpreadsheet

PhpSpreadsheetは、PHPExcelの後継であるPHPライブラリです。新規Excelファイルの作成や既存Excelファイルの読み書き、ファイル編集など一連の操作を無償で行うことができます。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/05/20 12:21

毎朝、健康観察と称してGoogleformでその日の体温や体の状態について回答を集めています。そのFORMの回答と在籍する全員の名簿を照らして回答のない者に対して回答を催促するメールを8時に送りたいと考えています。
コードのヒントとなる情報(下記)を頂いたのですが、未だにできません。

const nameList = "名簿"; // 名簿が保存されているシートの名前
const nameCol = 2; // 名簿のチェック対象となる列(1~)
const answerList = "回答"; // 検索対象の回答が保存されているシートの名前
const answerCol = 1; // 回答のチェック対象となる列(1~)
/****************************************************************************

  • 指定された名簿の中から、回答していないものを探す

*/
function searchUnrespondents() {
// 名簿データを 2次元配列として読み込む
const nameSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameList);
const nameData = nameSheet.getDataRange().getValues();
console.log(nameData);
// 回答データのチェック対象の列だけを 1次元配列として読み込む
const answerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(answerList);
const answerData = answerSheet.getRange(2, answerCol, answerSheet.getLastRow() - 1).getValues().flat();
console.log(answerData);
// 名簿データの行数分、回答の有無をチェックする
for (let i = 1; i < nameData.length; i++) {
searchStr = nameData[i][nameCol - 1];
if (!answerData.includes(searchStr) {
// 回答がない
console.log(i + " : " + searchStr + " is " + answerData.includes(searchStr));
}
}

以下の写真中の個人名、メールアドレスは、いずれもダミーデータです。
FORMの回答
イメージ説明

当日の回答のみを抽出
イメージ説明

名簿
イメージ説明

対象は700名ほどですが、6〜7割回答があるかどうかという現状を変えたいです。

ご助言等々、お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/05/20 12:50

そのヒントのコードはもらった状態そのままなのでしょうか。 それともご自分で少しいじって実行してみたりしたものなのでしょうか。
Kimoty

2022/05/20 12:58

もらったままです。恥ずかしながら正直、どこをいじれば良いのかさえ分かりません。
guest

回答1

0

ベストアンサー

元のコードを極力生かすなら下記のような感じになるでしょうか。

※シートを見る限り、回答シートの方は連番と氏名が連結されているため、そのままでは比較できません。
ここでは、メールアドレスで比較するようにしています。
(画面のダミーの例だと、全員同じメールアドレスなので正しく動きません)

js

1const nameList = "名簿"; // 名簿が保存されているシートの名前 2const nameCol = 4; // 名簿のチェック対象となる列(1~) 3const answerList = "回答"; // 検索対象の回答が保存されているシートの名前 4const answerCol = 2; // 回答のチェック対象となる列(1~)/ 5/**************************************************************************** 6 7指定された名簿の中から、回答していないものを探す 8*/ 9function searchUnrespondents() { 10 // 名簿データを 2次元配列として読み込む 11 const nameSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameList); 12 const nameData = nameSheet.getDataRange().getValues(); 13 // 回答データのチェック対象の列だけを 1次元配列として読み込む 14 const answerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(answerList); 15 const answerData = answerSheet.getRange(2, answerCol, answerSheet.getLastRow() - 1).getValues().flat(); 16 // 名簿データの行数分、回答の有無をチェックする 17 for (let i = 1; i < nameData.length; i++) { 18 const searchStr = nameData[i][nameCol - 1]; 19 if (!answerData.includes(searchStr) ){ 20 // 回答がない 21 console.log(i + " : " + searchStr + " is " + answerData.includes(searchStr)); 22 sendMail(nameData[i][1], nameData[i][3]) 23 } 24 } 25} 26 27function sendMail(name, mailAddress) { 28 const formUrl = 'https://docs.google.com/forms/d/e/******/viewform'; 29 const title = '健康観察フォーム回答のお願い'; 30 const body = `${name} 様\n\n本日の健康観察フォームが未回答です。\n至急、回答をお願いいたします。\n\n` 31 + `回答URL:\n${formUrl}`; 32 try { 33 console.log(body) 34 const draft = GmailApp.createDraft(mailAddress, title, body); 35 GmailApp.getDraft(draft.getId()).send(); 36 } catch (e) { 37 console.error(`メールの送信に失敗しました。メールアドレス:${mailAddress} 氏名:${name} エラー内容:${e}`); 38 } 39}

投稿2022/05/20 14:22

編集2022/05/20 15:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kimoty

2022/05/20 14:31

ご対応ありがとうございます。 重ねての質問で恐縮なのですが、「元のコードを極力生かすなら」とのことですが、より良い方法、より簡易的な方法等があれば教えていただきたいです。
Kimoty

2022/05/20 15:10

できましたーーー!! ありがとうございます!!! メールの送信件数に限界はありますか?700名の半分として350名くらいなら一気に処理できるものと考えて良いのでしょうか?
退会済みユーザー

退会済みユーザー

2022/05/20 15:57

GAS(Google Workspace)の無料プランでは 普通にメールをGmailApp.sendで送信すると100件/日が上限ですが、 一旦下書きを作ってから送ることで500件/日まで増やせるようです。 回答のコードは下書きを作ってから送る形に変えました。
Kimoty

2022/05/20 23:02

ありがとうございます!! やはり上限があるのですね。 最初のうち、100件/日では足りなそうなので、 500件まで送信できる状態に変えていただき、とても助かります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問