При отправке диаграмм SPARKLINE по электронной почте вместо данных отправляются пустые ячейки

У меня есть таблица Google с ячейками с данными и =sparkline() диаграммами в ячейках, и я хочу отправить это представление данных по электронной почте. В настоящее время я использую скрипт приложений для создания электронного письма в формате HTML, но диаграммы спарклайна отображаются в виде пустых ячеек в таблице электронного письма.

Данные, просматриваемые в Google Таблицах:
 введите описание изображения здесь Данные в том виде, в каком они просматриваются в электронном письме:
 введите описание изображения здесь

Это мой код скрипта приложений:

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];
}

Может ли кто-нибудь предложить код, необходимый для отображения диаграмм спарклайнов в электронном письме, или любую другую работу?


person okconfused    schedule 02.05.2018    source источник
comment
У меня возникла та же проблема при внедрении листа со спарклайнами в документ и слайд. Я думаю, что это ошибка, и я сообщил об этом. Issuetracker.google.com/issues/78443405   -  person Aidan    schedule 03.05.2018


Ответы (1)


Как насчет этого обходного пути? Я думаю, что в вашей ситуации есть несколько обходных путей. Так что считайте это одним из них.

К сожалению, диаграмму, созданную SPARKLINE(), нельзя напрямую импортировать в электронное письмо. Поэтому в качестве обходного пути я использовал следующий алгоритм.

  1. Преобразование из диаграммы, созданной SPARKLINE(), в изображения с помощью EmbeddedChart.
  2. Отправьте электронное письмо с изображениями в виде встроенных изображений.

Измененный скрипт:

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;
  }
}

Результат :

введите описание изображения здесь

Примечание :

  • В этом модифицированном скрипте предполагается, что вы используете диаграмму как SPARKLINE.
  • Я создал диаграмму на листе, используя insertChart(), потому что капля, полученная напрямую из newChart(), не может использоваться в качестве изображения. Когда диаграмма создается на листе, большой двоичный объект, полученный из созданной диаграммы, можно использовать в качестве изображения.
  • Если вы хотите изменить размер изображений, измените setOption("width", 200) и setOption("height", 100).

Использованная литература :

Если я неправильно понял ваш вопрос, извините.

person Tanaike    schedule 03.05.2018
comment
@okconfused Добро пожаловать. Я рад, что ваша проблема решена. - person Tanaike; 04.05.2018