首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GAS将某些列的值从google表单(忽略那些空白值)转换为电子邮件htmlBody的一部分?

如何使用GAS将某些列的值从google表单(忽略那些空白值)转换为电子邮件htmlBody的一部分?
EN

Stack Overflow用户
提问于 2020-09-13 18:39:11
回答 1查看 123关注 0票数 1

亲爱的有帮助的贡献者,我正在尝试从响应gsheet中获取某些列的值(从D列到I列,如下面的屏幕快照所示)。

每次提交google表单时,我都需要取取Stocktake Item1的这些值,直到第6项,将它们转到htmlBody中,以便在电子邮件的htmlBody中播放,如下面的截图所示:

不应显示那些值为零的斯德哥尔摩项。因此,每个记录可能有不同的值,但只有那些非空白或非零只应该显示。

究竟是否有这个目标呢?

目前,我只能实现显示它们的目标,不管是零还是非零。目前我这样做的方法是在另一个gsheet中创建一个表,然后使用脚本将响应表中Stocktake项的每个列的值相应地复制到该表中。然后,我创建了html模板,将该表转换为html。请参考下面表格“盘点”中我当前表格的截图。

我目前的代码如下:-

代码语言:javascript
复制
function gsheet2html() {
  const respsheet=SpreadsheetApp.openById("1c0-vzYQA_9KVHuGHKiYS-3iBBGhTg3EcCZBm7rZDIpM").getSheetByName('response');//input from gform
  const stocksheet=SpreadsheetApp.openById("1c0-vzYQA_9KVHuGHKiYS-3iBBGhTg3EcCZBm7rZDIpM").getSheetByName('stocktake'); //template
  
  const lrow=respsheet.getLastRow();
  const lr=stocksheet.getLastRow();
  var stockdate=respsheet.getRange(lrow,11).getValue();
  
  for(var i=4;i<lr-1;i++){
  stocksheet.getRange(i,2).setValue(respsheet.getRange(lrow,i).getValue());
  stocksheet.getRange(i,3).setValue(stockdate); 
  }
   
  const headers=stocksheet.getRange("A3:C3").getValues();
  const descr=headers[0][0];
  const qty=headers[0][1];
  const date=headers[0][2];
 
  const tableRangeValues=stocksheet.getRange(2,1,lr-2,3).getDisplayValues();
  const total=stocksheet.getRange(lr,1,1,2).getDisplayValues();
  const totalText=total[0][0];
  const totalSum=total[0][1];
  
  const htmlTemplate=HtmlService.createTemplateFromFile("report");
  htmlTemplate.descr=descr;
  htmlTemplate.qty=qty;
  htmlTemplate.date=date;
  htmlTemplate.stockdate=stockdate;
  htmlTemplate.totalText=totalText;
  htmlTemplate.totalSum=totalSum;
  htmlTemplate.tableRangeValues=tableRangeValues;
  
  const htmlForEmail=htmlTemplate.evaluate().getContent();
  console.log(htmlForEmail);
  
  MailApp.sendEmail(
    "testesttest@gmail.com",
    "Your Monthly Report",
    "Please open this email with HTML support",
    {htmlBody:htmlForEmail}
  );
}

我的电子邮件正文的HTML代码(html文件:'report')目前如下:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
 <br>Dear Mr. PIC,
 <br>
 <br>Stocktake for today for your kind perusal.
 <br>
 <br>
  <div style="background-color:purple;height:4px;"></div>
  
<table>
<thead>
<tr style="text-align:center;padding:6px;color:purple;font-size:16px;">
<th ><?=descr?></th><th><?=qty?></th><th><?=date?></th>
</tr>
</thead>
<tbody>

<?tableRangeValues.forEach((r,i)=>{
let color;
if(i%2===0){color="light-grey"} else{color="white"}?>
<tr style="background-color:<?=color?>;">
<td style="text-align:left;padding:6px;"><?=r[0]?></td>
<td style="text-align:right;padding:6px;"><?=r[1]?></td>
<td style="text-align:center;padding:6px;"><?=r[2]?></td>
</tr>
<?})?>

</tbody>
<tfoot>
<tr style="color:purple; font-size:16px;font-weight:bold;">
<td style="text-align:left;"><?=totalText?></td><td style="text-align:right;"><?=totalSum?></td>
</tr>
</tfoot>
</table>
<br>
<br>Thank you.
<br>
<br>Yours Sincerely,
<br>Somebody@Work
</body>
</html>

但是使用这种方法,所有的Stocktake项目都是固定的,所以每次我生成html电子邮件时,它都会显示所有的Socktake项目,如表所示。我的任务是省略零值的项目。到目前为止,我还不能使用这个固定的表来动态地省略那些零值的项。我认为理论上应该从响应表中直接获取值,验证那些非零值只在数组中,在html模板中转换它们。但我只是不知道该怎么编码。我只找到了显示从响应表中转换所有值的GAS,而不仅仅是选择性的。

希望这次我的问题陈述更清楚,希望有人能找到解决方案。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-14 03:21:04

修改要点:

stockdate工作表的值为"A3:C10“,就像您的第3张图像一样,在您的脚本中,tableRangeValues是来自"A2:C9”(即stocksheet.getRange(2,1,lr-2,3).getDisplayValues() )的值。这样,当我看到您的第三个图像时,空行和标题行都包含在tableRangeValues中。所以我认为你的剧本可能与你的实际情况不同。我很担心这个。

因此假设在实际情况下,tableRangeValues是以下值,

代码语言:javascript
复制
Stock Item1       9/20/2020
Stock Item2       9/20/2020
Stock Item3   6   9/20/2020
Stock Item4       9/20/2020
Stock Item5   7   9/20/2020
Stock Item6   8   9/20/2020

下面的修改如何?

发自:

代码语言:javascript
复制
htmlTemplate.tableRangeValues=tableRangeValues;

至:

代码语言:javascript
复制
htmlTemplate.tableRangeValues = tableRangeValues.filter(([,b]) => b.toString() != "");

代码语言:javascript
复制
htmlTemplate.tableRangeValues = tableRangeValues.filter(function(e) {return e[1].toString() != ""});

注意:

  • 当您的实际情况与您的第三个图像相同,并使用此修改脚本和两个标题行显示在HTML,请修改如下,并再次测试它。在此修改中,将从A4:C9检索值。
代码语言:javascript
复制
- From

const tableRangeValues=stocksheet.getRange(2,1,lr-2,3).getDisplayValues();

代码语言:javascript
复制
- To

const tableRangeValues=stocksheet.getRange(4,1,lr-4,3).getDisplayValues();

参考资料:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63874296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档