LFOHP
@LFOHP (PHOFL)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASでグループ分けしてBCCでメール送信する

Q&A

解決したいこと

GASで自動メール送信をしたいのです。
状況としては、グループ分けをしてAグループだけにBCCで送りたい。
| 社員区分 | 氏名 | メール|
| ---- | ---- |---- |
| A | 太郎 |aaa@example.com
| A | 二郎 |bbb@example.com
| B | 一郎 |ccc@example.com
| A | 花子 |ddd@example.com
| C | すみ子 |eee@example.com
| B | 金次郎 |fff@example.com

発生している問題・エラー

エラーはなし。

該当するソースコード

function sendMail(){
const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();

  const DOC_URL = 'https://docs.google.com/document/d/*****/edit'; //*****ドキュメントのURL*****
  const doc = DocumentApp.openByUrl(DOC_URL);
  const docText = doc.getBody().getText();

  const subject = 'タイトル';//タイトル
  const options = {name: '差出人'};//差出人のなまえ

  for(let i = 2; i <= lastRow; i++){


    const position = sheet.getRange(i, 1).getValue();//グループ

    const Name = sheet.getRange(i, 2).getValue(); //名
    const email = sheet.getRange(i, 3).getValue();//メールアドレス


    const body = docText
      .replace('{グループ名}',position)
      .replace('{氏名}',Name)


    if(sheet.getRange(i,3).getValue()== ""){
      continue;
    };


    GmailApp.sendEmail(recipient, subject, body, options);

  };
}

自分で試したこと

シートにメールアドレスが記載されていれば問題なく送信されます。
(1)グループわけしたい。Aグループに送るメールとBグループ、Cグループに送るメールは異なります。
グループ名で場合分けして、Aなら送信。それ以外は送らない。
(2)このコードだと、1つづつメールを繰り返し送ることになります。いまなら6回ですが、数が多くなると大変かな。、bccにいれて一度に送った方がいいのでは。recipientは自分、bccとして他のものに送りたい。

0

5Answer

  for(let i = 2; i <= lastRow; i++){
    const position = sheet.getRange(i, 1).getValue();//グループ
    const Name = sheet.getRange(i, 2).getValue(); //名
    const email = sheet.getRange(i, 3).getValue();//メールアドレス

とやるならば、最初に表の配列を作った方が良いかもです。
そうすると、filterを用いてのグループ選別もやりやすいと思います。

// メンバーをまとめて取得。
// 上から2行目、左から1列目を基点に、lastRow行3列目まで。
const rows = sheet.getRange(2, 1, lastRow, 3).getValues();

// 使いやすいように名前を付けたげる
const members = rows.map( row => {
    group : row[0],
    name : row[1],
    email : row[2]
});

// Aグループのみに絞る(関数作った方が良いかも)
const a_group_members = members.filter( member => member.group === 'A' );


// Aグループのみのメールリストを作成する。
// Gmailならカンマ区切りだと思うので、配列を平文化&接続文字をカンマにする
const a_group_mails = a_group_members.map( member => member.email ).join(',');

実際に試してはいませんが、参考までに。

0Like

Comments

  1. @LFOHP

    Questioner

    ありがとうございます。試してみます。

ここでつまづいています。デバッグしてもエラーになります。
構文エラー: SyntaxError: Unexpected token ':'
const members = rows.map( row => {
group:row[0],
name:row[1],
email:row[2]
});

0Like

すみません、素でjsの書き方間違えてましたね。
たぶんこう↓

const members = rows.map( row => {
    return {
        group : row[0],
        name : row[1],
        email : row[2]
    }
});

0Like

const a_group_members = members.filter( member => member.group === 'B' );
デバッグでここまでは良さそうです。連想配列と思うのですが、a_group_membersから、氏名を取り出したいです。a_group_members .nameではダメでした。御助言下さい。

0Like

Comments

  1. @LFOHP

    Questioner

    解決しました

デバッグすると、
const a_group_mails = a_group_members.map( member => member.email ).join(',');
undefinedになっています。a_group_membersは取れています。

0Like

Comments

  1. @LFOHP

    Questioner

    解決しています

Your answer might help someone💌