patternjavascriptMinor
Exporting a table from Google Sheets and sending it via email
Viewed 0 times
googleemailexportingsendingviaandfromsheetstable
Problem
Basically is a script to export a table from Google Sheets and send it via email. But it's not a clean script, although it works.
If there is any way of making it more simple, or instead of get all the values get the complete table and then export, that would be much more clean.
```
function sendFuelcount() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
sheet.setActiveSheet(sheet.getSheets()[0]);
var nom0 = sheet.getRange("A1").getValue();
var fuel0 = sheet.getRange("D1").getValue();
var line0 = nome0 + "\t\t" + fuel0;
var nom1 = sheet.getRange("A2").getValue();
var fuel1 = sheet.getRange("D2").getValue();
var data1 = sheet.getRange("C2").getValue();
var line1 = nom1 + "\t" + fuel1 + "\t\t" + "Em: " + data1;
var nom2 = sheet.getRange("A3").getValue();
var fuel2 = sheet.getRange("D3").getValue();
var data2 = sheet.getRange("C3").getValue();
var line2 = nom2 + "\t\t" + fuel2 + "\t\t" + "Em: " + data2;
var nome3 = sheet.getRange("A4").getValue();
var fuel3 = sheet.getRange("D4").getValue();
var data3 = sheet.getRange("C4").getValue();
var line3 = nome3 + "\t\t" + fuel3 + "\t\t" + "Em: " + data3;
var nome4 = sheet.getRange("A5").getValue();
var fuel4 = sheet.getRange("D5").getValue();
var data4 = sheet.getRange("C5").getValue();
var line4 = nome4 + "\t" + fuel4 + "\t\t" + "Em: " + data4;
var nome5 = sheet.getRange("A6").getValue(); //cBranco
var fuel5 = sheet.getRange("D6").getValue();
var data5 = sheet.getRange("C6").getValue();
var line5 = nome5 + "\t" + fuel5 + "\t\t" + "Em: " + data5;
var nome6 = sheet.getRange("A7").getValue();
var fuel6 = sheet.getRange("D7").getValue();
var data6 = sheet.getRange("C7").getValue();
var line6 = nome6 + "\t" + fuel6 + "\t\t" + "Em: " + data6;
var nome7 = sheet.getRange("A8").getValue();
var fuel7 = sheet.getRange("D8").getValue();
var data7 = sheet.getRange("C8").getValue();
var line7 = nome7 + "\t" + fuel7 + "\t\t" + "Em: " + data7;
var nome8 = sh
If there is any way of making it more simple, or instead of get all the values get the complete table and then export, that would be much more clean.
```
function sendFuelcount() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
sheet.setActiveSheet(sheet.getSheets()[0]);
var nom0 = sheet.getRange("A1").getValue();
var fuel0 = sheet.getRange("D1").getValue();
var line0 = nome0 + "\t\t" + fuel0;
var nom1 = sheet.getRange("A2").getValue();
var fuel1 = sheet.getRange("D2").getValue();
var data1 = sheet.getRange("C2").getValue();
var line1 = nom1 + "\t" + fuel1 + "\t\t" + "Em: " + data1;
var nom2 = sheet.getRange("A3").getValue();
var fuel2 = sheet.getRange("D3").getValue();
var data2 = sheet.getRange("C3").getValue();
var line2 = nom2 + "\t\t" + fuel2 + "\t\t" + "Em: " + data2;
var nome3 = sheet.getRange("A4").getValue();
var fuel3 = sheet.getRange("D4").getValue();
var data3 = sheet.getRange("C4").getValue();
var line3 = nome3 + "\t\t" + fuel3 + "\t\t" + "Em: " + data3;
var nome4 = sheet.getRange("A5").getValue();
var fuel4 = sheet.getRange("D5").getValue();
var data4 = sheet.getRange("C5").getValue();
var line4 = nome4 + "\t" + fuel4 + "\t\t" + "Em: " + data4;
var nome5 = sheet.getRange("A6").getValue(); //cBranco
var fuel5 = sheet.getRange("D6").getValue();
var data5 = sheet.getRange("C6").getValue();
var line5 = nome5 + "\t" + fuel5 + "\t\t" + "Em: " + data5;
var nome6 = sheet.getRange("A7").getValue();
var fuel6 = sheet.getRange("D7").getValue();
var data6 = sheet.getRange("C7").getValue();
var line6 = nome6 + "\t" + fuel6 + "\t\t" + "Em: " + data6;
var nome7 = sheet.getRange("A8").getValue();
var fuel7 = sheet.getRange("D8").getValue();
var data7 = sheet.getRange("C8").getValue();
var line7 = nome7 + "\t" + fuel7 + "\t\t" + "Em: " + data7;
var nome8 = sh
Solution
You're in desperate need of a loop. Anytime you start numbering your variables, you should consider whether a loop would be appropriate. I'm sure you did, but you probably got hung up because your
I'll start by defining some constants* for the different string values we have. That way we wont' mess anything up and they'll be consistent.
Next we'll define a couple of simple functions that return cell values based on the row number we pass in as an argument.
Now we can start rewriting the main function with that
This returns a Spreadsheet object, not a sheet object. Google uses
Ok, now that for loop...
Note that you had
*Javascript doesn't actually have constants, but by convention, you shouldn't assign new values to variables with ALLCAPS names.
lineX assignments vary by just a little. That can be taken care of with a switch statement.I'll start by defining some constants* for the different string values we have. That way we wont' mess anything up and they'll be consistent.
var TAB = "\t";
var DOUBLETAB = tab + tab;
var EM = "Em: ";
var NA = "N.A.";Next we'll define a couple of simple functions that return cell values based on the row number we pass in as an argument.
function getNom(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,1).getValue();
}
function getFuel(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,4).getValue();
}
function getData(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,3).getValue();
}Now we can start rewriting the main function with that
loop and switch I was talking about earlier. But before I do, I'd like to note that you have a deceiving variable name.var sheet = SpreadsheetApp.getActiveSpreadsheet();This returns a Spreadsheet object, not a sheet object. Google uses
ss ("spreadsheet") in their documentation, so i will follow suit and rename it appropriately.var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheets()[0]);Ok, now that for loop...
function sendFuelcount() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheets()[0]);
var TAB = "\t";
var DOUBLETAB = tab + tab;
var NEWLINE = "\n"
var EM = "Em: ";
var NA = "N.A.";
var line;
for (var i = 1; i <= 25; i++) {
switch(i) {
case 1:
line = getNom(i) + DOUBLETAB + getFuel(i);
break;
case 2:
case 5:
case 6:
case 7:
case 8:
case 11:
case 12:
case 13:
case 16:
case 17:
case 18:
case 19:
case 21:
case 22:
line = line + NEWLINE + getNom(i) + TAB + getFuel(i) + DOUBLETAB + EM + getData(i);
break;
case 3:
case 4:
case 9:
case 10:
case 14:
case 15:
case 20:
case 23:
line = line + NEWLINE + getNom(i) + DOUBLETAB + getFuel(i) + DOUBLETAB + EM + getData(i);
break;
case 24:
case 25:
line = line + NEWLINE + getNom(i) + TAB + getFuel(i) + DOUBLETAB + NA;
break;
}
var today = Utilities.formatDate(new Date(), "GMT", "dd-MMM-yyyy");
var msg = line + NEWLINE + " " + NEWLINE + "EMAIL GERADO AUTOMATICAMENTE POR GROUND OPERATIONS";
MailApp.sendEmail("emails@gmail.com", "Fuel " + today + "", msg, {name: 'Fuel Qty Auto Message'});
}Note that you had
var data instead of var date. I changed it to today so it won't be confused with the Date() function by Mr. Maintainer.*Javascript doesn't actually have constants, but by convention, you shouldn't assign new values to variables with ALLCAPS names.
Code Snippets
var TAB = "\t";
var DOUBLETAB = tab + tab;
var EM = "Em: ";
var NA = "N.A.";function getNom(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,1).getValue();
}
function getFuel(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,4).getValue();
}
function getData(rowNumber) {
return SpreadsheetApp.getActiveSheet().getRange(rowNumber,3).getValue();
}var sheet = SpreadsheetApp.getActiveSpreadsheet();var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheets()[0]);function sendFuelcount() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheets()[0]);
var TAB = "\t";
var DOUBLETAB = tab + tab;
var NEWLINE = "\n"
var EM = "Em: ";
var NA = "N.A.";
var line;
for (var i = 1; i <= 25; i++) {
switch(i) {
case 1:
line = getNom(i) + DOUBLETAB + getFuel(i);
break;
case 2:
case 5:
case 6:
case 7:
case 8:
case 11:
case 12:
case 13:
case 16:
case 17:
case 18:
case 19:
case 21:
case 22:
line = line + NEWLINE + getNom(i) + TAB + getFuel(i) + DOUBLETAB + EM + getData(i);
break;
case 3:
case 4:
case 9:
case 10:
case 14:
case 15:
case 20:
case 23:
line = line + NEWLINE + getNom(i) + DOUBLETAB + getFuel(i) + DOUBLETAB + EM + getData(i);
break;
case 24:
case 25:
line = line + NEWLINE + getNom(i) + TAB + getFuel(i) + DOUBLETAB + NA;
break;
}
var today = Utilities.formatDate(new Date(), "GMT", "dd-MMM-yyyy");
var msg = line + NEWLINE + " " + NEWLINE + "EMAIL GERADO AUTOMATICAMENTE POR GROUND OPERATIONS";
MailApp.sendEmail("emails@gmail.com", "Fuel " + today + "", msg, {name: 'Fuel Qty Auto Message'});
}Context
StackExchange Code Review Q#57089, answer score: 5
Revisions (0)
No revisions yet.