5

我有一个使用Google App脚本HtmlService开发的网络应用程序,它使用SpreadsheetApp填充html驱动器中的Excel表单。另一部分呼叫ContentService将数据下载为excel文件。Google App脚本ContentService downloadAsFile不能正常工作

function doGet(e) { 
    // Read excel sheet 
    //getAppFile(); 
    // Render the application from HTML template 
    return HtmlService.createTemplateFromFile('index').evaluate() 
    .setTitle('Go Smart') 
    .setSandboxMode(HtmlService.SandboxMode.IFRAME); 
} 

function downloadDoubleQuateCsvFile() { 
    var sheetId = PropertiesService.getScriptProperties().getProperty('sheetId'); 
    var ss = SpreadsheetApp.openById(sheetId).getActiveSheet(); 
    //var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var maxColumn = ss.getLastColumn(); 
    var maxRow = ss.getLastRow(); 
    var data = ss.getRange(1, 1, maxRow, maxColumn).getValues(); 
    if (data.length > 1) { 
     var csv = ""; 
     for (var row = 0; row < data.length; row++) { 
      for (var col = 0; col < data[row].length; col++) { 
       if (data[row][col].toString().indexOf(",") != - 1) { 
        data[row][col] = "\"" + data[row][col] + "\""; 
       } 
      } 

      if (row < data.length - 1) { 
       csv += data[row].join(",") + "\r\n"; 
      } else { 
       csv += data[row]; 
      } 
     } 

     csvFile = csv; 
    } 

    return makeCSV(csvFile); 
} 

function makeCSV(csvString) { 
    var csvFileName = 'test.csv'; 
    var output = ContentService.createTextOutput(); 
    output.setMimeType(ContentService.MimeType.CSV); 
    output.setContent(csvString); 
    output.downloadAsFile(csvFileName); 
    return output; 
} 

此脚本只是在控制台中提供表头详细信息对象,并且它不下载任何文件。

<button class="btn btn-success btn-sm" onclick="google.script.run.downloadDoubleQuateCsvFile()">Export</button> 

在第二个函数中添加return之后,我得到这样的错误。

Error: The script completed but the returned value is not a supported return type. 

注:我在与数据

驱动器)的Excel文件
+0

这只会从发布的url请求的doGet()或doPost()返回。 –

+0

@SpencerEaston从doGet()我已经创建并返回HtmlService。有没有其他方法可以实现它? – devo

+0

我没有在你的例子中看到doGet()。顺便说一句,你没有'返回'makeCSV(csvFile)。 –

回答

10

要获得downloadAsFile()方法来工作contentService的对象必须从一个的doGet(返回或叫的doPost()来自已发布的网址。

例子:

function doGet(){ 
     var output = ContentService.createTextOutput(); 
     output.setMimeType(ContentService.MimeType.CSV); 
     output.setContent(csvString); 
     output.downloadAsFile(csvFileName); 
     return output; 
} 

在你的代码是通过google.script.run返回对象contentService的一个网页。它不会要求从浏览器下载。实际上,返回contentservice对象将导致错误,因为它不是返回到google.script.run调用的有效对象。只允许原生JavaScript对象。

如果你想让它工作,你需要向用户提供一个点击链接,指向另一个标签中的脚本。或者,您可以在指向脚本的定位标记上使用“下载”属性。

例如,这种假定您保存返回修复程序downloadDoubleQuateCsvFile():

function doGet(e){ 
    var serveCSV = e.parameter.servecsv; 
    if(serveCSV){return downloadDoubleQuateCsvFile()} 
    return HtmlService.createTemplateFromFile('index').evaluate() 
.setTitle('Go Smart') 
.setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

在您的网页:

<a href="//script.google.com/WebAppURL/exec?servecsv=true" target="_blank">Click here to download</a> 

Remeber,这是不是在所有的浏览器都支持。 (只想到铬,歌剧,Firefox支持自动下载)。

+0

死的权利 - 很好的解释! – Mogsdad