通过电子邮件发送SPARKLINE图表会发送空白单元格而不是数据

时间:2018-05-02 11:43:04

标签: javascript google-apps-script google-sheets google-sheets-api sparklines

我有一张包含数据和function drawTable() { var ss_data = getData(); var data = ss_data[0]; var background = ss_data[1]; var fontColor = ss_data[2]; var fontStyles = ss_data[3]; var fontWeight = ss_data[4]; var fontSize = ss_data[5]; var html = "<table border='1'>"; for (var i = 0; i < data.length; i++) { html += "<tr>" for (var j = 0; j < data[i].length; j++) { html += "<td style='height:20px;background:" + background[i][j] + ";color:" + fontColor[i][j] + ";font-style:" + fontStyles[i][j] + ";font-weight:" + fontWeight[i][j] + ";font-size:" + (fontSize[i][j] + 6) + "px;'>" + data[i][j] + "</td>"; } html += "</tr>"; } html + "</table>" MailApp.sendEmail({ to: Session.getUser().getEmail(), subject: "Spreadsheet Data", htmlBody: html }); } function getData(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getDataRange(); var background = ss.getBackgrounds(); var val = ss.getDisplayValues(); var fontColor = ss.getFontColors(); var fontStyles = ss.getFontStyles(); var fontWeight = ss.getFontWeights(); var fontSize = ss.getFontSizes(); return [val, background, fontColor, fontStyles, fontWeight, fontSize]; } 单元格图表单元格的Google表格,并希望在电子邮件中发送此数据视图。我目前使用Apps Script制作HTML电子邮件,但迷你图表在电子邮件表格中显示为空白单元格。

Google表格上显示的数据:
enter image description here 电子邮件中查看的数据:
enter image description here

这是我的Apps脚本代码:

cloudblobclient

有人可以建议在电子邮件中显示迷你图表所需的代码,还是其他任何工作?

1 个答案:

答案 0 :(得分:3)

这个解决方法怎么样?我认为你的情况有几种解决方法。所以请把它想象成其中之一。

不幸的是,SPARKLINE()创建的图表无法直接导入到电子邮件中。因此,作为一种解决方法,我使用了以下流程。

  1. 使用EmbeddedChart从SPARKLINE()创建的图表转换为图像。
  2. 使用图像作为内嵌图像发送电子邮件。
  3. 修改后的脚本:

    drawTable();
    function drawTable() {
        var ss_data = getData();
        var data = ss_data[0];
        var background = ss_data[1];
        var fontColor = ss_data[2];
        var fontStyles = ss_data[3];
        var fontWeight = ss_data[4];
        var fontSize = ss_data[5];
        var html = "<table border='1'>";
        var images = {}; // Added
        for (var i = 0; i < data.length; i++) {
            html += "<tr>"
            for (var j = 0; j < data[i].length; j++) {
                if (typeof data[i][j] == "object") { // Added
                    html += "<td style='height:20px;background:" + background[i][j] + ";color:" + fontColor[i][j] + ";font-style:" + fontStyles[i][j] + ";font-weight:" + fontWeight[i][j] + ";font-size:" + (fontSize[i][j] + 6) + "px;'><img src='cid:img" + i + "'></td>"; // Added
                    images["img" + i] = data[i][j]; // Added
                } else {
                    html += "<td style='height:20px;background:" + background[i][j] + ";color:" + fontColor[i][j] + ";font-style:" + fontStyles[i][j] + ";font-weight:" + fontWeight[i][j] + ";font-size:" + (fontSize[i][j] + 6) + "px;'>" + data[i][j] + "</td>";
                }
            }
            html += "</tr>";
        }
        html + "</table>"
        MailApp.sendEmail({
            to: Session.getUser().getEmail(),
            subject: "Spreadsheet Data",
            htmlBody: html,
            inlineImages: images // Added
        })
    }
    
    function getData(){
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var ss = sheet.getDataRange();
      var val = ss.getDisplayValues();
      var background = ss.getBackgrounds();
      var fontColor = ss.getFontColors();
      var fontStyles = ss.getFontStyles();
      var fontWeight = ss.getFontWeights();
      var fontSize = ss.getFontSizes();
      var formulas = ss.getFormulas(); // Added
      val = val.map(function(e, i){return e.map(function(f, j){return f ? f : getSPARKLINE(sheet, formulas[i][j])})}); // Added
      return [val,background,fontColor,fontStyles,fontWeight,fontSize]; 
    }
    
    // Added
    function getSPARKLINE(sheet, formula) {
      formula = formula.toUpperCase();
      if (~formula.indexOf("SPARKLINE")) {
        var chart = sheet.newChart()
          .setChartType(Charts.ChartType.SPARKLINE)
          .addRange(sheet.getRange(formula.match(/\w+:\w+/)[0]))
          .setTransposeRowsAndColumns(true)
          .setOption("showAxisLines", false)
          .setOption("showValueLabels", false)
          .setOption("width", 200)
          .setOption("height", 100)
          .setPosition(1, 1, 0, 0)
          .build();
        sheet.insertChart(chart); 
        var createdChart = sheet.getCharts()[0];
        var blob = createdChart.getAs('image/png');
        sheet.removeChart(createdChart);
        return blob;
      }
    }
    

    结果:

    enter image description here

    注意:

    • 在此修改后的脚本中,假设您将图表用作SPARKLINE
    • 我使用insertChart()在工作表中创建了一个图表,因为直接从newChart()检索到的blob无法用作图像。为工作表创建图表时,从创建的图表中检索的blob可用作图像。
    • 如果您想修改图片尺寸,请修改setOption("width", 200)setOption("height", 100)

    参考文献:

    如果我误解了你的问题,我很抱歉。