5

Mam aplikację internetową opracowaną przy użyciu Google Apps Script HtmlService oraz z formularza html, zapełniając arkusz Excela na dysku Google przy użyciu SpreadsheetApp. I jeszcze jedna sekcja dzwoni ContentService, aby pobrać dane jako plik Excela.Google App Script ContentService downloadAsFile nie działa

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

Ten skrypt podaje obiekt szczegółów nagłówka arkusza w konsoli i nie pobiera żadnego pliku.

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

Po dodaniu zwrotu w drugiej funkcji, pojawia się błąd podobny do tego.

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

Uwaga: Mam plik Excela w dysku z danymi

+0

Powoduje to powracanie z żądania doGet() lub doPost() z opublikowanego adresu URL. –

+0

@SpencerEaston Od doGet() Już tworzenie i zwracanie HtmlService. Czy jest jakiś inny sposób, aby to osiągnąć? – devo

+0

Nie widzę metody doGet() w twoim przykładzie. I przy okazji w twoim przykładzie nie "zwróciłeś" makeCSV (csvFile). –

Odpowiedz

10

Aby uzyskać downloadAsFile() metoda pracy obiektu contentService musi być zwrócony z doGet() lub doPost() o nazwie z opublikowanego adresu URL.

Przykład:

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

W kodzie wracasz obiekt contentService do strony internetowej poprzez google.script.run. Nie będzie żądać pobrania z przeglądarki. W rzeczywistości zwrócenie obiektu contentservice spowoduje błąd, ponieważ nie jest prawidłowym obiektem do powrotu do wywołania google.script.run. Dozwolone są tylko macierzyste obiekty javascript.

Jeśli chcesz, aby działało, musisz pokazać użytkownikom link do kliknięcia, który wskazywałby twój skrypt w innej karcie. Możesz też użyć atrybutu "pobierz" na znaczniku zakotwiczenia, który wskazuje Twój skrypt.

Na przykład, a to zakłada zachować poprawkę powrotną do 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); 

} 

na swojej stronie internetowej:

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

Pamiętaj, że ta nie jest dostępna we wszystkich przeglądarkach. (Pomyśl tylko chrome, opera, firefox obsługuje autodownload).

+0

Martwe prawo - świetne wyjaśnienie! – Mogsdad