Javascript Google脚本:使用UrlFetchApp触发器生成HTML图表

Javascript Google脚本:使用UrlFetchApp触发器生成HTML图表,javascript,html,google-apps-script,google-visualization,Javascript,Html,Google Apps Script,Google Visualization,第一次在这里发布,我正在学习Javascript和Google的脚本功能,所以如果我不够清楚,或者如果我错过了另一个与我的答案类似的帖子,我表示歉意 为了给我一点背景知识,如果我错过了一个更简单的解决方案,我正在做一个谷歌脚本,从一个客户提交的谷歌表单中为谷歌文档创建一个摘要报告,他想要一个包含一系列线性比例选择摘要的图表,所以我需要找到一种生成图表的方法,输出到文件(或获取blob),然后插入到摘要文档中。起初,我访问了Charts API(从google脚本内部),它似乎更适合我的目标方法,

第一次在这里发布,我正在学习Javascript和Google的脚本功能,所以如果我不够清楚,或者如果我错过了另一个与我的答案类似的帖子,我表示歉意

为了给我一点背景知识,如果我错过了一个更简单的解决方案,我正在做一个谷歌脚本,从一个客户提交的谷歌表单中为谷歌文档创建一个摘要报告,他想要一个包含一系列线性比例选择摘要的图表,所以我需要找到一种生成图表的方法,输出到文件(或获取blob),然后插入到摘要文档中。起初,我访问了Charts API(从google脚本内部),它似乎更适合我的目标方法,但可视化似乎相当有限,因此我开始研究基于html的google.Visualization版本的图表,该版本产生了更好的结果

到目前为止,我已经成功地创建了一个google web应用程序,它为我的目的吐出一个外观不错的图表(在我测试东西的时候,现在使用平面数据),并输出到一个google驱动点,以便在以后的日期(下面的代码)进入google文档,当我在浏览器中打开脚本应用程序时,它工作得很好。我遇到的问题是,这是一个更广泛的工作流程的一部分,我正试图找出如何触发图表生成,方法是在我更广泛的脚本中作为函数运行,或者使用UrlFetchApp函数调用现有的web应用程序,以使用get请求生成图表,而脚本似乎不喜欢这个请求。。。我能弄清楚的是,它是从web应用程序中吐出html,但没有触发应用程序中的函数,我无法弄清楚这是谷歌有意阻止的,还是我错误地调用脚本来触发图表生成

如果我没有很好地解释这一点,我表示歉意,如果我遗漏了任何一点,我很乐意跟进,但如果有人克服了类似的问题,我将感谢任何帮助

谢谢, 尼尔

代码: Script.js
函数doGet(e){
var template=HtmlService.createTemplateFromFile('html');
返回template.evaluate('Web应用程序窗口标题').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
功能剂量测量(base64Blob){
strDataURI=base64Blob.replace(“数据:image/png;base64,”,”);
var str=Utilities.base64Decode(strDataURI);
var fileBlob=Utilities.newBlob(str).setContentType('image/png').setName(“graph.png”);
var file=DriveApp.createFile(fileBlob);
}
HTML:

function drawGasTestChart(dt){
      if(dt){
        var hA=dt[0];
        dt.splice(0,1);
        var dA=dt.slice();
        var data = new google.visualization.DataTable();
        for(var i=0;i<hA.length;i++){
          if(i===0){
            data.addColumn('string',hA[i]);
          }else{
            data.addColumn('number',hA[i]);
          }
        }
        data.addRows(dA);
        var options={
        title:'Gas Test Results',
        fontSize: 12,
        fontName: 'Roman',
        width:640,
        height:400,
        hAxis:{slantedText:true,slantedTextAngle:90},
        legend:{position:'bottom'},
        chartArea:{left:75,top:75,width:'60%',height:'50%'},
        series:{0: {targetAxisIndex: 0},1: {targetAxisIndex: 1}, 2: {targetAxisIndex: 1}},
        vAxes: {0: {title: '%LEL'},1: {title: 'PPM'}}
        };
        var chart=new google.visualization.ColumnChart(document.getElementById('GasTest'));
        google.visualization.events.addListener(chart,'ready',function(){
        gdatObj['imagURI']=chart.getImageURI();
        gdatObj.ready=true;
        saveGasTestChartImage();
    });
        chart.draw(data,options);
      }
    }

    google.charts.load('current', {'packages':['corechart']});
    //google.charts.setOnLoadCallback(drawAllCharts);
    console.log('charts.html code');
    </script>
功能测试图(dt){
if(dt){
var hA=dt[0];
dt.拼接(0,1);
var dA=dt.slice();
var data=new google.visualization.DataTable();

对于(var i=0;i这是我最后想到的,以防它对任何人都有用……这有点像黑客,但按照我最初问题的条款工作

最后,当我在浏览器中打开html图表页面时,我找不到一种脚本化的调用方式,因此我找到了一种解决方法,使用Google的pagespeedonline服务调用web应用程序并为我构建图表图像(这不是它的预期用途,但它确实起到了作用)…再说一次,确实有一种更优雅的方式来实现这一点,但这在目前是可行的

我试着在整个脚本中进行评论,以描述脚本的工作原理,但如果有任何不清楚的地方,我表示歉意:

第一个包含源数据的Google脚本代码,我想将其转换为图表:

代码.gs

//如果需要从其他地方传递图表数据,可以作为脚本中更大工作流的一部分运行
函数doGet(e){
//指定一个唯一标识符,以了解稍后拾取时将调用什么图表
var thisUuid=Utilities.getUuid();
//数据作为示例的一部分存储在这里,但您可以根据自己的喜好进行重新配置,只要您愿意
//在html页面中相应地更改图表生成java:https://developers.google.com/chart/interactive/docs/examples#mouseover-工具提示示例
var jsonData=[“Tarantella(1989)”,7.2],
[“盗窃罪(1996)”,7.8],
[“涂鸦虫(1997)”,7.1],
[“以下(1998)”,7.5],
[“Memento(2000)”,8.4],
[“失眠(2002)”,7.2],
[“蝙蝠侠开始(2005)”,8.2],
[“声望(2006)”,8.5],
[“黑暗骑士(2008)”,9.0],
[“开始(2010)”,8.8],
[“黑暗骑士崛起(2012)”,8.4],
[《星际(2014)》,8.6],
[“码头(2015)”,6.8],
[“敦刻尔克(2017)”,7.9],
[“特尼特(2020)”,0];
//指定希望文件结束的文件夹id(可以避免,但可能会使跟踪输出文件更加困难)
var outputFolderId=/[将驱动器文件夹id放在此处]
//uri对参数进行编码,以便在pagespeedonline url获取中作为url的一部分传递
var timestampEncoded=encodeURIComponent(thisUuid);
var jsonDataEncoded=encodeURIComponent(JSON.stringify(jsonData));
var folderIdEncoded=encodeURIComponent(outputFolderId);
//声明包含图表构建功能的google应用程序的id
var chartBuildAppId=/[在此处插入应用程序id];
//构建您将调用的url,包括构建图表所需的参数
var url='1〕https://script.google.com/macros/s/“+chartBuildAppId+”/exec?thisUuid=”+thisUuid+”&jsonData=“+JSONDATACoded+”&folderId=”+FolderIncoded;
//url编码,以便将其作为pagespeedonline url的一部分包含
var urlEncoded=encodeURIComponent(JSON.stringify(url));
//在此处获取API密钥:https://