0

I've got a Google spreadsheet with a table of data. After a form is filled out, my script will take the data and send it in an email. I have code that will take each value I want from the data range and put it into a table, but it's all done by identifying over a hundred variables.

Is there a way to use an array of some kind so that the html table is populated with each row of data from the data range?

I freely admit to being a programming newbie, and that this is probably some of the worst spaghetti code out there. Any help is greatly appreciated (even if it's a primer on javascript).

function Gradereport() {

// This script e-mails the contents of a form to a given recipient

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Report");
var recloc = sheet.getRange("D2"); //cell location of student email
var recipient = recloc.getValue(); //student's email address
var lastloc = sheet.getRange("B2");
var last = lastloc.getValue();  
var firstloc = sheet.getRange("A2");
var first = firstloc.getValue();
var courseloc = sheet.getRange("E2");
var course = courseloc.getValue();
var dateloc = sheet.getRange("C2");
var date = dateloc.getValue();
var gradeloc = sheet.getRange("D5");
var grade = gradeloc.getValue();
var totloc = sheet.getRange("D4");
var total = totloc.getValue();
var perloc = sheet.getRange("D6");
var percent = perloc.getValue();
var dataRange = sheet.getRange("A4:B9");
var data = dataRange.getValues();
// assignment cell locations
var assignloc1 = sheet.getRange("A5");
var assignloc2 = sheet.getRange("A6");
var assignloc3 = sheet.getRange("A7");
var assignloc4 = sheet.getRange("A8");
var assignloc5 = sheet.getRange("A9");
// assignment values
var assign1 = assignloc1.getValue();
var assign2 = assignloc2.getValue();
var assign3 = assignloc3.getValue();
var assign4 = assignloc4.getValue();
var assign5 = assignloc5.getValue();
// assignment score locations
var scoreloc1 = sheet.getRange("B5");
var scoreloc2 = sheet.getRange("B6");
var scoreloc3 = sheet.getRange("B7");
var scoreloc4 = sheet.getRange("B8");
var scoreloc5 = sheet.getRange("B9");
// assignment score values
var score1 = scoreloc1.getValue();
var score2 = scoreloc2.getValue();
var score3 = scoreloc3.getValue();
var score4 = scoreloc4.getValue();
var score5 = scoreloc5.getValue();

  // error message
var errmess = first+' '+last+', your Pin code did not match. Please double check your entry and re-submit. Contact your professor if you get this message again.';
var subject = course+' Grade Report';
var body = first+' '+last+', here is your grade report, requested on '+date+'. Grade '+grade+'/'+total+', '+percent+'%. Score breakdown: '+data;
var bodyHTML1 = '<p>'+first+' '+last+', here is your grade report.<br> Grade '+grade+'/'+total+', '+percent+'%.</p>';
// var bodyHTML2 = '<p>'+data+'</p>';
var bodyHTML2 = '<table> <tr> <td> '+assign1+' </td> <td> '+score1+' </td> </tr> <tr> <td> '+assign2+' </td> <td> '+score2+' </td> </tr> <tr> <td> '+assign3+' </td> <td> '+score3+' </td> </tr> <tr> <td> '+assign4+' </td> <td> '+score4+' </td> </tr> <tr> <td> '+assign5+' </td> <td> '+score5+' </td> </tr> </table>';

var bodyHTML3 = '<p>Sent by the <a href="http://www.steegle.com/">Steegle.com</a> Contact Us Form Google Apps Script</p>';
var advancedArgs = {htmlBody:bodyHTML1+bodyHTML2 ,};
var pinloc = sheet.getRange("G2");
var pin = pinloc.getValue();

if(pin == 1){       
MailApp.sendEmail(recipient, subject, body, advancedArgs);
}else{
MailApp.sendEmail(recipient, subject, errmess);
}
}

1 Answer 1

3

I've took to the liberty to make some changes on your code, along with the loop to generate the table, here it is:

function report2() {
  var LOC = {
    recipient: [1,3],//D2
    first: [1,0],    //A2
    last: [1,1],     //B2
    course: [1,4],   //E2
    date: [1,2],     //C2
    grade: [4,3],    //D5
    total: [3,3],    //D4
    percent: [5,3],  //D6
  };

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Report");
  var values = sheet.getDataRange().getValues(); //get all values on the spreadsheet at once
  var data = {};
  for( var i in LOC )  //row        //column   (all zero-based index)
    data[i] = values[ LOC[i][0] ][ LOC[i][1] ];

  var errmess = data.first+' '+data.last+', your Pin code did not match. Please double check your entry and re-submit. Contact your professor if you get this message again.';
  var subject = data.course+' Grade Report';
  var body = data.first+' '+data.last+', here is your grade report, requested on '+data.date+'. Grade '+data.grade+'/'+data.total+', '+data.percent+'%. Score breakdown: '+data.data;
  var bodyHTML1 = '<p>'+data.first+' '+data.last+', here is your grade report.<br> Grade '+data.grade+'/'+data.total+', '+data.percent+'%.</p>';

  var bodyHTML2 = '<table>';
  for( var i = 4; i < 9; ++i )
    bodyHTML2 += '<tr><td> '+values[i][0]+' </td><td> '+values[i][1]+' </td></tr>';
  bodyHTML2 += '</table>';

  var advancedArgs = {htmlBody: bodyHTML1+bodyHTML2};
  var pin = values[1][6]; //G2 
  if( pin == 1 )
    MailApp.sendEmail(recipient, subject, body, advancedArgs);
  else
    MailApp.sendEmail(recipient, subject, errmess);
}

I've developed a script to send emails based on spreadsheet data, like you're trying. I think you might find it useful. It's called FormEmailer. You find it on the Script Gallery (under the menu Insert > Script) and on its site.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.