【问题标题】:Emailing a chart from a Google spreadsheet with apps script使用应用程序脚本从 Google 电子表格中通过电子邮件发送图表
【发布时间】:2013-11-15 10:48:02
【问题描述】:

我一直在寻找答案,但没有运气。得到了一个谷歌电子表格,它使用应用程序脚本连接到数据库以将一些原始数据拉入电子表格。然后我使用各种电子表格公式来处理这些数据,然后最终创建一个图表。

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

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

谢谢!

迈凯尔

【问题讨论】:

  • 将其作为图像类型嵌入电子邮件或交互式图表中?
  • 你搜索的不是很好,在这个论坛上简单搜索会返回一些结果。示例:stackoverflow.com/questions/17769746/…
  • 你发给我的例子实际上并没有回答我的问题,问题是一样的,但使用的方法不是我想要达到的。我已经知道如何使用数据表逐步创建图表,我想知道是否可以访问电子表格中的现有图表...
  • 您是否尝试在发送电子邮件的脚本中使用 Charts.newDataTable() 创建图表,然后将此图表对象添加到电子邮件的 HTML 正文中?也许您必须使用build 函数才能将图表转换为图像。查看图表部分的this example

标签: google-apps-script html-email


【解决方案1】:

将电子表格设为公开并运行脚本。下面用 cmets 粘贴的脚本的修改版本

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】:

    这是我用来通过电子邮件发送图表的代码。 请注意,您需要向拥有电子表格链接访问权限的所有人授予权限。如果没有,您将在电子邮件中收到一张图片,说明用户未登录。(非常烦人,没有解决方法)

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

    【讨论】:

    • 我尝试运行此脚本,但发送的电子邮件仅包含空白图表。有什么特别的事情你必须做才能让它工作吗?
    • 确保知道链接的每个人都可以访问电子表格。在邮件客户端中当然需要接受图片的下载。有一些图表在发送邮件时显示不同,但我没有遇到空白的情况
    • 感谢您的回复,我只是以自己的身份进行测试,因此访问不是问题。
    • 您可以运行调试以查找电子邮件调用中使用的属性值吗?
    • 我也有这个问题。您必须启用“链接共享”(“任何有链接的人都可以查看”)。
    【解决方案3】:

    由于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});
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2014-09-14
      相关资源
      最近更新 更多