Google apps script 仅将非空单元格复制到通过电子邮件发送的HTML对象中

Google apps script 仅将非空单元格复制到通过电子邮件发送的HTML对象中,google-apps-script,google-sheets,gmail-api,Google Apps Script,Google Sheets,Gmail Api,我有一个脚本,它将一个表从谷歌工作表复制到一封每天自动发送的电子邮件中(有一个触发器)。表总是从单元格K1开始,并且总是有6列,但是行数总是不同的。我想解释一下,让它变得更有活力。以下是谷歌脚本: function CheckShare() { // Fetch the monthly sales var Range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily AA Catergory Share").get

我有一个脚本,它将一个表从谷歌工作表复制到一封每天自动发送的电子邮件中(有一个触发器)。表总是从单元格K1开始,并且总是有6列,但是行数总是不同的。我想解释一下,让它变得更有活力。以下是谷歌脚本:

function CheckShare() {
  // Fetch the monthly sales
  var Range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily AA Catergory Share").getRange("I2"); 
  var result = Range.getValue();
  var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily AA Catergory Share").getRange("K1:P10").getValues();


  var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="width:100%;table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;'

  var htmltable = '<table ' + TABLEFORMAT +' ">';

for (row = 0; row<data.length; row++){

htmltable += '<tr>';

for (col = 0 ;col<data[row].length; col++){
  if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} 
  else
    if (row === 0)  {
      htmltable += '<th>' + data[row][col] + '</th>';
    }

  else {htmltable += '<td>' + data[row][col] + '</td>';}
}

     htmltable += '</tr>';
}

     htmltable += '</table>';
     Logger.log(data);
     Logger.log(htmltable);
  // Check totals sales
  if (result >0){
    // Fetch the email address
      var emailAddress = "reports@gmail.com";
    // Send Alert Email.
    var message = 'There are ' + result +' deviating metrics: https://docs.google.com/spreadsheets/d/1AQEBTt919TIu92Gb9TeZRD3KpSm3L_WCHgTOmw/edit#gid=1525731698'
    + ' See the dashboard here: <link> ';
    var subject = 'Transaction Monitoring Alert: AA Share';
    MailApp.sendEmail(emailAddress, subject, message, {htmlBody:htmltable});
    }
}
函数CheckShare(){
//拿到月销售额
var Range=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“每日AA类别共享”).getRange(“I2”);
var result=Range.getValue();
var data=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“每日AA类别共享”).getRange(“K1:P10”).getValues();
var TABLEFORMAT='cellspacing=“2”cellpadding=“2”dir=“ltr”border=“1”style=“宽度:100%;表格布局:固定;字体大小:10pt;字体系列:arial,sans,sans serif;边框收拢:收拢;边框:1px实心#ccc;字体重量:普通;颜色:黑色;背景颜色:白色;文本对齐:中间;文本装饰:无;字体样式:普通;'
var htmltable='使用
.getDataRange()
而不是
.getRange(“K1:P10”)
,这应该只返回包含实际数据的行

var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily AA Catergory Share").getDataRange().getValues();
编辑:

由于您无法使用
.getDataRange()
来实现您的目标。请尝试使用
.getLastRow()
而不是将其传递给您的
getRange()
。下面的代码应获得K1:Px的范围(x=您拥有的数据行数)

使用
.getDataRange()
而不是
.getRange(“K1:P10”)
,这应该只返回包含实际数据的行

var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daily AA Catergory Share").getDataRange().getValues();
编辑:

由于您无法使用
.getDataRange()
来实现您的目标。请尝试使用
.getLastRow()
而不是将其传递给您的
getRange()
。下面的代码应获得K1:Px的范围(x=您拥有的数据行数)


嘿@ross,谢谢你的建议,但问题是A:F列中还有其他数据,例如,我不想包含在电子邮件中。我只想包含K:P列中的数据。不用担心-你是对的
getDataRange()
如果在其他列中有数据,将获取太多数据。我已编辑了我的答案,并包含了一个使用
getLastRow()的解决方案
相反,看看这是否有帮助。嘿@ross,不幸的是,这也没有帮助。例如,如果a:F列中的表有10行,那么这个脚本也将从K:P列中获取10行,即使K:P列中可能只有前4行中的数据。嘿@ross,我刚刚成功。基本上我使用了你的代码,但我只需将我想在电子邮件中发送的表移动到一个单独的选项卡。非常感谢!太好了!我一直在努力寻找一种方法来过滤掉所有的空值,但这也很有效。这让我松了一口气。嘿@ross,谢谢你的建议,但问题是a:F列中还有其他数据,例如,我没有希望包含在电子邮件中。我只希望包含K:P列中的数据。不用担心-你说得对
getDataRange()
如果在其他列中有数据,则会获取太多数据。我已编辑了我的答案,并包含了一个使用
getLastRow()的解决方案
相反,看看这是否有帮助。嘿@ross,不幸的是,这也没有帮助。例如,如果a:F列中的表有10行,那么这个脚本也将从K:P列中获取10行,即使K:P列中可能只有前4行中的数据。嘿@ross,我刚刚成功。基本上我使用了你的代码,但我只需将我想在电子邮件中发送的表移动到一个单独的选项卡。非常感谢!太好了!我一直在努力寻找一种方法来过滤掉所有的空值,但这也很有效。真是一种解脱。