使用应用脚本通过电子邮件发送Google电子表格中的图表

时间:2013-11-15 10:48:03

标签: google-apps-script html-email

我一直在寻找答案,但没有运气。获得了一个Google电子表格,该电子表格使用应用脚本连接到数据库,将一些原始数据导入电子表格。然后,我使用各种电子表格公式来操作该数据,然后最终创建一个图表。

我的下一个挑战是,我希望能够通过应用脚本将该图表嵌入到电子邮件中并将其作为HTML电子邮件发送..

这是完全可能还是我应该开始寻找其他解决方案?

谢谢!

的Mikael

3 个答案:

答案 0 :(得分:5)

以下是我用来通过电子邮件发送图表的代码。 请注意,您需要为每个人提供电子表格的链接访问权限。如果没有,你会在电子邮件中得到一张图片,说明用户没有登录。(非常烦人,没有解决方法)

function emailCharts(sheet,emails,emailSubject){
  var charts = sheet.getCharts();

  if(charts.length==0){
    MailApp.sendEmail({
      to: emails,
      subject: "ERROR:"+emailSubject,
      htmlBody: "No charts in the spreadsheet"});    
    return;
  }

  var chartBlobs=new Array(charts.length); 
  var emailBody="Charts<br>";
  var emailImages={};
  for(var i=0;i<charts.length;i++){
    chartBlobs[i]= charts[i].getAs("image/png").setName("chartBlob"+i);
    emailBody= emailBody + "<img src='cid:chart"+i+"'><br>";
    emailImages["chart"+i]= chartBlobs[i];
  }

  MailApp.sendEmail({
    to: emails,
    subject: emailSubject,
    htmlBody: emailBody,
    inlineImages:emailImages});

}

答案 1 :(得分:1)

将电子表格设为公共并运行脚本。下面粘贴的修改版本的脚本带有注释

enter code here function 
emailCharts(sheet,emails,emailSubject){
var targetspreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // Active        spreadsheet of the key file
var sheet = targetspreadsheet.getSheetByName('Sheet1'); // Change the sheet name 
var emailSubject = 'test';
var emails = 'test@test.com'; // your email ID
var charts = sheet.getCharts();


if(charts.length==0){
MailApp.sendEmail({
to: emails,
subject: "ERROR:"+emailSubject,
htmlBody: "No charts in the spreadsheet"});    
return;
}

var chartBlobs=new Array(charts.length); 
var emailBody="Charts<br>";
var emailImages={};
for(var i=0;i<charts.length;i++){
var builder = charts[i].modify();
builder.setOption('vAxis.format', '#');
var newchart = builder.build();
chartBlobs[i]= newchart.getAs('image/png');
emailBody= emailBody + "<p align='center'><img src='cid:chart"+i+"'></p>";
emailImages["chart"+i]= chartBlobs[i];
}

MailApp.sendEmail({
to: emails,
subject: emailSubject,
htmlBody: emailBody,
inlineImages:emailImages});
}

答案 2 :(得分:0)

由于Charts服务似乎只是SpreadsheetApp服务中使用的EmbeddedChart的部分实现,因此并非所有ChartTypes和选项都已实现,这意味着图表可能会呈现与Google表格不同。下面的上一个答案的修改后的版本将意味着图表在Google表格中以图片形式包含在电子邮件中。由于此解决方案还使用脚本生成的身份验证令牌,因此不必更改Google表格的查看权限。

// Based on https://stackoverflow.com/a/22200230/1027723
function emailChartUsingImageUrl(){
  const idt = SpreadsheetApp.getActive().getId();
  const sheet = SpreadsheetApp.getActiveSheet();
  const charts = sheet.getCharts();
  
  // setup some variables for our email
  const chartBlobs = new Array(); 
  const emailImages = {};
  let emailBody = "Charts<br>";
  
  // setup our call to fetch the chart image
  const token = ScriptApp.getOAuthToken(); // project requires https://www.googleapis.com/auth/spreadsheets scope
  const baseUrl = `https://docs.google.com/spreadsheets/d/${idt}/embed/oimg?access_token=${token}&disposition=ATTACHMENT&bo=false&filetype=png&oid=`;
  
  // for each chart fetch the download image as a blob and appended to our email body
  charts.forEach(function(chart, i){
    // NEW BIT
    const url = baseUrl + chart.getChartId();
    chartBlobs[i] = UrlFetchApp.fetch(url).getBlob();
    emailBody +=  "<p align='center'><img src='cid:chart"+i+"'></p>";
    emailImages["chart"+i]= chartBlobs[i];
  });
  
  // Send email with inline images
  MailApp.sendEmail({
    to: "me@example.com",
    subject: "Email Charts - get chart from image url",
    htmlBody: emailBody,
    inlineImages:emailImages});
}