-
-
Save mrkrndvs/a2c8ff518b16e9188338cb809e06ccf1 to your computer and use it in GitHub Desktop.
Google apps script to export an individual sheet as csv file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* script to export data of the named sheet as an individual csv files | |
* sheet downloaded to Google Drive and then downloaded as a CSV file | |
* file named according to the name of the sheet | |
* original author: Michael Derazon (https://gist.github.com/mderazon/9655893) | |
*/ | |
function onOpen() { | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var csvMenuEntries = [{name: "Download Primary Time File", functionName: "saveAsCSV"}]; | |
ss.addMenu("Creating a Timetable", csvMenuEntries); | |
}; | |
function saveAsCSV() { | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var sheet = ss.getSheetByName('Primary Time'); | |
// create a folder from the name of the spreadsheet | |
var folder = DriveApp.createFolder(ss.getName().toLowerCase().replace(/ /g,'_') + '_csv_' + new Date().getTime()); | |
// append ".csv" extension to the sheet name | |
fileName = sheet.getName() + ".csv"; | |
// convert all available sheet data to csv format | |
var csvFile = convertRangeToCsvFile_(fileName, sheet); | |
// create a file in the Docs List with the given name and the csv data | |
var file = folder.createFile(fileName, csvFile); | |
//File downlaod | |
var downloadURL = file.getDownloadUrl().slice(0, -8); | |
showurl(downloadURL); | |
} | |
function showurl(downloadURL) { | |
var app = UiApp.createApplication().setHeight('60').setWidth('150'); | |
//Change what the popup says here | |
app.setTitle("Your timetable CSV is ready!"); | |
var panel = app.createPopupPanel() | |
//Change what the download button says here | |
var link = app.createAnchor('Click here to download', downloadURL); | |
panel.add(link); | |
app.add(panel); | |
var doc = SpreadsheetApp.getActive(); | |
doc.show(app); | |
} | |
function convertRangeToCsvFile_(csvFileName, sheet) { | |
// get available data range in the spreadsheet | |
var activeRange = sheet.getDataRange(); | |
try { | |
var data = activeRange.getValues(); | |
var csvFile = undefined; | |
// loop through the data in the range and build a string with the csv data | |
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] + "\""; | |
} | |
} | |
// join each row's columns | |
// add a carriage return to end of each row, except for the last one | |
if (row < data.length-1) { | |
csv += data[row].join(",") + "\r\n"; | |
} | |
else { | |
csv += data[row]; | |
} | |
} | |
csvFile = csv; | |
} | |
return csvFile; | |
} | |
catch(err) { | |
Logger.log(err); | |
Browser.msgBox(err); | |
} | |
} |
@gabrielgz92 I got it to work by replacing the showurl function with this:
function showurl(downloadURL) { //Change what the download button says here var link = HtmlService.createHtmlOutput('<a href="' + downloadURL + '">Click here to download</a>'); SpreadsheetApp.getUi().showModalDialog(link, 'Your CSV file is ready!'); }
This helped a TON. Thank you for this update! Worked perfect.
Hello, in my case I got a correct downloadURL but only working if I manually introduce it to the browser. However if url is called within the Apps Script (showModalDialog()) I got initial 303
status redirection followed up 18 302
status redirection since I end up with ERR_TOO_MANY_REDIRECTS
. Any clue?
- Folder is created OK
- Csv file is created OK
- URL file is created OK
- By changing folder permissions is not working aswell.
Other approach I did--> If I just copy the GET request from manually get
File > Download > CSV
in the browser works but within the dialog got this error:
Thanks!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This was great, thank you!