gyoumu01
@gyoumu01 (HIEP HOANGDUC)

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!

GoogleスプレッドシートでGoogleScriptを使用して、リスト内のすべての人にPDFファイルを送信するにはどうすればよいですか?

解複数のPDFファイルを複数の人に送信する方法

私は次のように問題を解決しています。
GoogleスプレッドシートのGoogleScirptサービスを使用して、PDFファイルをすべての人に送信します。リストの全員に1つのファイルを送信してみました。うまくいきました。
しかし、次のような新しい問題が発生しました
一人一人が異なるファイルを持ち、数は完全に異なります。
例えば:
Johnさんには、John_ 999901.pdf、John_ 999902.pdf、John_999903.pdfの3つのPDFファイルがあります。
Davidさんには2つのPDFファイル、David_ 999901.pdf、David_99990があります
Junさんには2つのPDFファイルがあります:Jun_999901.pdf、Jun_999902.pdf
そして最後に、Michelさんには1つのPDFファイルしかありません:Michel_999901.pdf。
すべてのPDFファイルはGOOGLE DRIVE で保存してあります。
リスト内の名前に対応するファイル名に基づいてメールを送信する方法はありませんか?

自分で試したこと

下記はGoogle App Script コードです。

function onOpen() 
{
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('メール送信')

      .addItem('送信', 'sendFormToAll')
      .addToUi();
}
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}
function sendFormToAll()
{
   var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');

   var last_row = sheet.getDataRange().getLastRow();

   for(var row=2; row <= last_row; row++)
   {
     sendEmailWithAttachment(row);
     sheet.getRange(row,8).setValue("送信済");
   }
}

function sendPDFForm()
{
  var row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();
  sendEmailWithAttachment(row);
}

function sendEmailWithAttachment(row)
{
  var filename= 'File.pdf';

  var file = DriveApp.getFilesByName(filename);

  if (!file.hasNext()) 
  {
    console.error("Could not open file "+filename);
    return;
  }

  var client = getClientInfo(row);

  var template = HtmlService
      .createTemplateFromFile('index');
  template.client = client;
  var message = template.evaluate().getContent();


  MailApp.sendEmail({
    to: client.email,
    subject: "納品書",
    htmlBody: message ,
    attachments: [file.next().getAs(MimeType.PDF)]
  });

}

function getClientInfo(row)
{
   var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');

   var values = sheet.getRange(row,1,row,8).getValues();
   var rec = values[0];

  var client = 
      {
        company:rec[0],
        department:rec[1],
        derector:rec[2],
        name: rec[3],
        email: rec[6]
      };
  client.name = client.name;
  return client;
}

下記はHTMLコードです

<!DOCTYPE html>
<html>
   <head>
      <base target="_top">
      <!-- CSS only -->
      <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
      <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>

   </head>


   <body style="background-image: url('https://miyagen8.co.jp/wp-content/uploads/2021/11/background.png');background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: center;">
     <div  >

      <p> <?= client.company ?> </p>

      <p>いつもお世話になります。</p>
      <p>納品書送ります。ご確認お願い致します。</p>

      <p>*********************************************************</p>


     </div>
   </body>
</html>

皆さんよろしくお願い申し上げます。
教えたらありがたいです。

0

1Answer

表示されているスクリプトからスプレッドシートを想像してスクリプトを下記のように修正してみました。

修正ポイントは次の通りです。

  • ループ内で SpreadsheetApp.getActive().getSheetByName, sheet.getRange, getValuesetValueを使用すると、スクリプトのコストが高まりますので、最初に値をスプレッドシートから取得して取得したデータを使って処理を行うように修正しました。
  • Johnさんには、John_ 999901.pdf、John_ 999902.pdf、John_999903.pdfの3つのPDFファイルがあります。から、このようなファイルを検索するためのロジックを追加しました。

修正したスクリプト

function sendFormToAll() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  var values = sheet.getRange("A2:G" + sheet.getLastRow()).getValues();
  var rangeList = values.reduce((ar, [company, department, derector, name, , , email], i) => {
    var files = DriveApp.searchFiles(`title contains '${name}' and trashed=false`);
    var attachments = [];
    var r = new RegExp(`^${name}[_\\d\\s]+\\.pdf\$`, "i");
    while (files.hasNext()) {
      var file = files.next();
      if (r.test(file.getName())) {
        attachments.push(file.getBlob());
      }
    }
    if (attachments.length == 0) {
      console.error("Could not open file related to " + name);
      return ar;
    }
    var template = HtmlService.createTemplateFromFile('i06');
    template.client = { company, department, derector, name, email };
    var message = template.evaluate().getContent();
    MailApp.sendEmail({ to: email, subject: "納品書", htmlBody: message, attachments });
    ar.push(`H${i + 2}`);
    return ar;
  }, []);
  if (rangeList.length == 0) return;
  sheet.getRangeList(rangeList).setValue("送信済");
}

Note

  • 上記の修正では、Johnさんには、John_ 999901.pdf、John_ 999902.pdf、John_999903.pdfの3つのPDFファイルがあります。Johnは、スプレッドシートの列D(上記のスクリプトでは変数name)として想定しました。これが間違っているとスクリプトを修正する必要があると思われます。
  • もしも上記の修正したスクリプトが期待したように機能しない場合は、謝罪致します。その際は、より確実にスクリプトを修正するために、使用されている"リスト"(質問中で使用されている)や実際のファイル名を確認する必要があるかもしれません。
0Like

Your answer might help someone💌