当前位置: 首页 > 知识库问答 >
问题:

如何从电子表格中获取Google Drive PDF文件“名称包含单元格D1:D中的信息”,并将其作为电子邮件发送给A列中的每个联系人

罗烨霖
2023-03-14

免责声明:我是编程新手,请耐心等待:)

我试图发送电子邮件与PDF文件附件不同的电子邮件联系人在谷歌电子表格。通过在google drive上查找文件名,每个附件必须对每个名称都是唯一的。有人能帮你处理这段额外的代码吗?

我的代码目前正在发送带有自定义消息和文件附件的电子邮件,并在脚本运行结束后将每个电子邮件标记为在C列中发送。但是,我想向每个电子邮件地址发送一个不同的PDF附件,最好是编写一些代码,在D列中获取“投资者名称”,在Google Drive中查找包含该名称的文件,并将该文件附加到要发送的电子邮件中。

因此,我需要按每个对应单元格中的每个名称获取PDF文件,而不是按下面所述(我相信):

var file=DriveApp。getFilesByName('SHARE CERTIFICATE#60-JOHN APPLE.pdf');

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 250;   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 250)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    var emailSent = row[2];     // Third column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Sending emails from a Spreadsheet";
      var file = DriveApp.getFilesByName('SHARE CERTIFICATE #60 - JOHN APPLE.pdf');
  if (file.hasNext()) {
    MailApp.sendEmail(emailAddress, subject, message, {
    attachments: [file.next().getAs(MimeType.PDF)],
    name: 'Custom email Team'
 });
      sheet.getRange(startRow + i, 3).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}
}

我期望的最终结果是:-向不同的电子邮件地址发送带有消息和主题的电子邮件-附加一个PDF文件,文件名对应于每个电子邮件收件人的名称

提前非常感谢,这将非常有帮助!:)

共有2个答案

颛孙凯定
2023-03-14

我想这样的东西会起作用的:

function sendEmails() {
  var ss=SpreadsheetApp.getActive();
  var sheet=ss.getActiveSheet();
  var logsheet=ss.getSheetByName('logSheet');//added logsheet
  if(!logsheet){ss.insertSheet('logSheet');}
  var startRow=3;//added one row here to accomodate subject and pdfFldrId  
  var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-startRow-1,sheet.getLastColumn())
  var data = dataRange.getValues();
  var subject= sheet.getRange("B2").getValue();
  var pdfFldrId=sheet.getRange("C2").getValue();
  for (var i=0;i<data.length;++i) {
    var row=data[i];
    var emailAddress=row[0];  
    var message=row[1];       
    var emailSent=row[2];     
    var pdfName=row[3];        
    var files=DriveApp.getFolderById(pdfFldrId).getFilesByName(pdfName);
    var n=0;
    while(files.hasNext()) {
      var file=files.next();
      n++;
    }
    if(n>1){
      var ts=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss");
      logsheet.append([ts,pdfName,'more than file with this name']);
      continue;//breaks out of loop increment index and keep going
    }
    if(emailSent!="EMAIL_SENT") {

    MailApp.sendEmail(emailAddress, subject, message, {attachments:[file]});
      sheet.getRange(startRow + i, 3).setValue("EMAIL_SENT");
    }
  }
}

如果你想用相同的电子邮件列表发送不同的图像,只需复制工作表,更改C2和B2中的PDFFDRID和主题,并学会使用相同的文件名保存不同的图像。

乌璞瑜
2023-03-14

您的代码缺少一个小细节。基本上,当使用getRange时,应该从D列获取数据:

var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
var startCol = 1;
var numCols = 4; // Number of columns to process (should include column D)
// Fetch the range of cells A2:D
var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);

请注意,要检索的行数不必硬编码。如果使用getLastRow,则可以获取最后一行的内容索引,并使用该索引获取所需的范围。这样,您就可以准确地获得所需的行数;不多不少。

然后,在循环中,检索列D中的值,如下所示:

var fileName = row[3];      // Fourth column

最后,从Drive中检索文件,如下所示:

var files = DriveApp.getFilesByName(fileName);

所以完全修改后的代码可能是这样的:

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
  var startCol = 1;
  var numCols = 4; // Number of columns to process (should include column D)
  // Fetch the range of cells A2:D
  var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    var emailSent = row[2];     // Third column
    var fileName = row[3];      // Fourth column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Sending emails from a Spreadsheet";
      var files = DriveApp.getFilesByName(fileName);
      if (files.hasNext()) {
        var file = files.next();
        MailApp.sendEmail(emailAddress, subject, message, {
          attachments: [file], // No need to use getAs if your file is already a PDF
          name: 'Custom email Team'
        });
        sheet.getRange(startRow + i, 3).setValue(EMAIL_SENT);
        // Make sure the cell is updated right away in case the script is interrupted
        SpreadsheetApp.flush();
      }
    }
  }
}

我对该代码做了一些额外的小更改(例如,将变量file更改为files,然后定义var file=files.next())。

我希望这对你有帮助。

 类似资料:
  • 这是我第一次发布问题,我是一个完全的新手,所以如果我没有包含你可能需要的所有信息,我很抱歉。 我有一个谷歌工作表,它包含几个数据选项卡,这些数据被手动输入到一个表中。例如:表中的数据输入表 在每张表格中,有许多表格,其中输入了特定区域内每个“公司”的数据。 我试图做的是调整一个脚本,该脚本将转到指定的工作表,获取特定表的一系列单元格,将其转换为PDF格式,并使用同一工作表的另一个选项卡中列出的电子

  • 问题内容: 现在,我已经建立了一个PHP电子邮件表单,并且一切正常。但是,在测试时,我只得到了发件人的电子邮件地址作为名称。我想要的是发件人的姓名,例如: 约翰·杜 科目科目科目 代替: j.doe@website.com 科目科目科目 下面是代码… 有谁可以帮助我吗?谢谢。 PHP: 问题答案: 在您的4行说完之后添加一行:

  • 问题内容: 我的输入文件是一个CSV文件,通过运行一些包含python Tabulate模块的python脚本,我创建了一个如下表: tabulate_output 或 我想将此表发送到电子邮件正文中,而 不是 使用python 作为 附件发送 。 我已经创建了sendMail函数,并且期望在mail_body中发送表。 问题答案: 此代码以典型的纯文本格式以及html multipart / a

  • 问题内容: 我想在我正在创建的网站上使用联系表格,但是PHP不是一个选择,因为客户端不希望使用它。是否有一种聪明的方法可以解决此问题,例如发送电子邮件参数(非标准参数)或使用外部联系表?是否有一些不使用广告且可以轻松修改为其他语言的好产品? 谢谢。 问题答案: 联系人表单有数百种可嵌入(最可能基于)的解决方案,使您能够使用PHP等服务器端语言来解决问题。只是一个快速的谷歌搜索会给你一些。 或者,您

  • 我有一个谷歌电子表格,里面有多张表格,我想把每一张表格复制到一个新的电子表格中,并在一个特定的单元格中以文本命名新的电子表格。我很高兴运行脚本多次,所以我想让它复制活动表。 即。我所拥有的=称为“颜色”的电子表格——工作表1=“红色”,工作表2=“蓝色”,工作表3=“黄色”,等等。 我想要什么= 名为“红色”的电子表格。电子表格叫做"蓝色",电子表格叫做"黄色" 到目前为止,我有这个脚本,但它告诉

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd