Deze uitleg zal zich nog ontwikkelen. In ieder geval komt een uitleg er bij over de for csv
clausule en hoe je willekeurige welke tabel kunt downloaden.
De gegevens vanuit Exact Online importeer je in Google Sheets via de volgende stappen:
- Registreer een account op Invantive Cloud.
- Maak een virtuele database op Exact Online.
- Voeg een applicatie toe met een module.
- Definieer de query in de module.
- Kopieer de hyperlink voor de module.
- Plak de code in Google Sheets.
Onderstaand worden de stappen verder uitgewerkt:
Registreer account en maak virtuele Exact Online database
De stappen voor registratie en een virtuele Exact Online database definieren lees je terug op Verbind Power BI met Exact Online. Volg deze stappen tot “Power BI connector instellen voor Exact Online”.
Voeg applicatie en module toe
Doorloop de volgende stappen:
- Ga naar “Applicaties” (1).
- En kies “Nieuw” (2).
- Voer de applicatienaam “Download Google Sheets” in (3).
- Kies “Opslaan” (4).
- Kies “Modules” (5).
- Voeg een module toe via “Nieuw” (6).
Definieer query in module
Door de volgende stappen:
- Vul de modulecode “Open Verkoopfacturen” in (7).
- Kies “PSQL” als moduletaal (8).
- Maak de module uitvoerbaar (9).
- Plak de broncode die hieronder staat er in (10).
- Kies “Opslaan” (11).
De code is:
begin
cloud_http.set_response_content_type('text/csv');
cloud_http.set_response_header_value('Content-Disposition', 'attachment; filename="download.csv"');
for r
in
( select number_attr, invoicedate, outstandingamtdc from AROutstandingItems@eol for csv
)
loop
cloud_http.append_to_response_body_text(r.csv);
end loop;
end;
Kopieer de hyperlink
Doorloop de volgende stappen:
- Klik bij de applicatie op “Uitvoeren” (12).
- Kies de geregistreerde database (13).
- Kies “Uitvoeren” (14).
- Het standaard modulemenu verschijnt.
- De module kan uitgevoerd worden (15).
- Maar bewaar eerst de link om de module los uit te voeren tegen de database (16).
- Bij direct uitvoeren verschijnt na enkele seconden een CSV in de downloadbalk voor alle gekozen Exact Online administraties (17).
- De hyperlink van stap (16) kan ook in de browser uitgevoerd worden (18) met dezelfde CSV als resultaat (19).
Direct Laden in Google Sheets
De volgende stap is om de module rechtstreeks in Google Sheets te laten laden via de volgende stappen:
- Start Google Sheets.
- Kies “Extra” (1) en dan “Apps Script” (voorheen: “Script Editor”) (2).
- Plak de onderstaande code in de Apps Script Editor (3).
- Kies “Opslaan” (4).
- Voeg het werkblad “Data” toe aan het spreadsheet (5).
- Voeg de URL toe (6).
- Voeg de Cloud gebruikersnaam toe (7).
- Voeg het Cloud wachtwoord toe (8).
- Voeg tenslotte de formule toe om de gegevens te downloaden (9):
=populateSheetWithCSV("Data", celurl, celgebruiker, celwachtwoord)
.
- De data verschijnt in het werkblad “Data”.
- Als de formule ververst, wordt de data ook bijgewerkt volgens de cache instellingen op de database in Invantive Cloud.
Gebruikte Google Sheets code voor downloaden CSV met Basic Authentication:
//
// This function assumes the CSV has no fields with commas,
// and strips out all the double quotes.
//
// Based upon:
// https://redfin.engineering/when-importdata-isnt-good-enough-retrieving-csv-files-behind-basic-auth-with-a-google-apps-script-6c563f3328c5
//
function parseCsvResponse(csvString)
{
var retArray = [];
var strLines = csvString.split(/n/g);
var strLineLen = strLines.length;
for (var i = 0; i < strLineLen; i++)
{
var line = strLines[i];
if (line != '')
{
retArray.push(line.replace(/"/g, "").split(/,/));
}
}
return retArray;
}
function populateSheetWithCSV(sheetName, csvUrl, user, pw)
{
//
// Request the CSV.
//
var resp = UrlFetchApp.fetch
( csvUrl
, {
headers:
{
// Use basic authentication.
'Authorization': 'Basic ' + Utilities.base64Encode(user + ':' + pw, Utilities.Charset.UTF_8)
}
}
);
//
// Parse the response as a CSV.
//
var csvContent = parseCsvResponse(resp.getContentText());
// Clear everything in the sheet.
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
sheet.clearContents().clearFormats();
// Set the values in the sheet (as efficiently as we know how).
sheet.getRange
( 1
, 1
, csvContent.length /* Rows. */
, csvContent[0].length /* Columns. */
)
.setValues(csvContent)
;
}