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

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

不应显示那些值为零的斯德哥尔摩项。因此,每个记录可能有不同的值,但只有那些非空白或非零只应该显示。
究竟是否有这个目标呢?
目前,我只能实现显示它们的目标,不管是零还是非零。目前我这样做的方法是在另一个gsheet中创建一个表,然后使用脚本将响应表中Stocktake项的每个列的值相应地复制到该表中。然后,我创建了html模板,将该表转换为html。请参考下面表格“盘点”中我当前表格的截图。

我目前的代码如下:-
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')目前如下:
<!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,而不仅仅是选择性的。
希望这次我的问题陈述更清楚,希望有人能找到解决方案。提前谢谢你。
发布于 2020-09-14 03:21:04
修改要点:
当stockdate工作表的值为"A3:C10“,就像您的第3张图像一样,在您的脚本中,tableRangeValues是来自"A2:C9”(即stocksheet.getRange(2,1,lr-2,3).getDisplayValues() )的值。这样,当我看到您的第三个图像时,空行和标题行都包含在tableRangeValues中。所以我认为你的剧本可能与你的实际情况不同。我很担心这个。
因此假设在实际情况下,tableRangeValues是以下值,
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下面的修改如何?
发自:
htmlTemplate.tableRangeValues=tableRangeValues;至:
htmlTemplate.tableRangeValues = tableRangeValues.filter(([,b]) => b.toString() != "");或
htmlTemplate.tableRangeValues = tableRangeValues.filter(function(e) {return e[1].toString() != ""});注意:
A4:C9检索值。- Fromconst tableRangeValues=stocksheet.getRange(2,1,lr-2,3).getDisplayValues();
- Toconst tableRangeValues=stocksheet.getRange(4,1,lr-4,3).getDisplayValues();
参考资料:
https://stackoverflow.com/questions/63874296
复制相似问题