5

Ho un'app Web sviluppata con Google App Script HtmlService e dal modulo html, che popola il foglio excel nell'unità Google utilizzando SpreadsheetApp. E un'altra sezione sta chiamando ContentService per scaricare i dati come file Excel.Google App Script ContentService downloadAsFile not working

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

Questo script fornisce solo l'oggetto dettagli dell'intestazione del foglio nella console e non sta scaricando alcun file.

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

Dopo aver aggiunto il ritorno nella seconda funzione, ricevo un errore come questo.

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

Nota: Ho il file excel in auto con i dati

+0

Questo funzionerebbe solo restituendo da doGet() o doPost() richiesto da un URL pubblicato. –

+0

@SpencerEaston Da doGet() sto già creando e restituendo HtmlService. C'è un altro modo per raggiungerlo? – devo

+0

Non vedo doGet() nell'esempio. E nel tuo esempio non hai restituito makeCSV (csvFile). –

risposta

10

Per ottenere downloadAsFile() per lavorare l'oggetto contentService deve essere tornato da un doGet() o doPost() chiamato dall'URL pubblicato.

Esempio:

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

Nel codice si restituisce l'oggetto contentService a una pagina web tramite google.script.run. Non richiederà un download dal browser. In effetti, la restituzione di un oggetto del servizio di contenuto genera un errore poiché non è un oggetto valido per tornare a una chiamata google.script.run. Sono ammessi solo oggetti javascript nativi.

Se si desidera che funzioni, è necessario presentare agli utenti un collegamento per fare clic che indichi il proprio script in un'altra scheda. Oppure puoi usare l'attributo 'download' su un tag di ancoraggio che punta al tuo script.

Ad esempio, e questo presuppone di mantenere la correzione ritorno al 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); 

} 

nella vostra pagina web:

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

Ricordate che questo non è supportata in tutti i browser. (Pensa solo chrome, opera, firefox supporta l'autodownload).

+0

Dead right - ottima spiegazione! – Mogsdad