Get, treat and set data from a spreadsheet to another - javascript

I'm new to GAS. I'm trying to accomplish four tasks in a single spreadsheet with three separate sheets to relate to.
I want to copy data from the 'rawData sheet', set it in an array, rearrange the array, and set the values in the 'destination sheet'. And keep it active for new submissions (i.e. getLastRow/appendRow).
In 'destination sheet' I want to color code based on status.
Create a button in 'destination sheet' to mark row(case) complete and move from 'destination' to the 'complete sheet'.
And add onEdit triggers for each.
Your input is greatly appreciated.
Thanks.
function colorCode() {
var range = outerArray;
Logger.log(range);
var row = dBoard.getRange(dBoard.getLastRow(),1,1,dBoard.getLastColumn());
var submitter = range[3];
var status = range[11];
Logger.log(submitter);
Logger.log(status);
//var column = range.getColumn();
//var row = range.getRow();
if (status === "Approved"){
var rowToColor = row.offset(0,0,1,13);
rowToColor.setBackground("#6bb2ff");
}
else if (status === "Requester"){
var rowToColor = row.offset(0,0,1,13);
rowToColor.setBackground("#ffe16b");
}
else if (range === 12 && range > 1 && status === "Denied"){
var rowToColor = row.offset(0,0,1,13);
rowToColor.setBackground("#f9441b");
}
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source1 = ss.getSheetByName("Copy of rawData");
var dBoard = ss.getSheetByName("dBoard2");
//function copyData() {
//var rawD = source1.getRange(1,1,source1.getLastRow(),source1.getLastColumn()).getValues();
//Logger.log(rawD);
function setData() {
var rawD = source1.getRange(source1.getLastRow(),1,1,source1.getLastColumn()).getValues();
//Logger.log(limits);
var columnA = rawD[0][0];
var columnB = rawD[0][18];
var columnC = rawD[0][13];
var columnD = rawD[0][2];
var columnE = rawD[0][3]
var columnF = rawD[0][4];
var columnG = rawD[0][5];
var columnH = rawD[0][6];
var columnI = rawD[0][7];
var columnJ = rawD[0][8];
var columnK = rawD[0][9];
var columnL = rawD[0][11];
var columnM = rawD[0][12];
var outerArray = [columnA,
columnB,
columnC,
columnD,
columnE,
columnF,
columnG,
columnH,
columnI,
columnJ,
columnK,
columnL,
columnM];
Logger.log(columnA);
Logger.log(columnB);
Logger.log(outerArray);
dBoard.getRange(2,1,outerArray.length,outerArray.length);
dBoard.appendRow(outerArray);
}

Related

I need to copy variable range of data into a new empty row of another sheet. How do I need to change those scripts?

function saveData(){
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var formSheet = spreadsheet.getSheetByName("Receipt");
var dataSheet = spreadsheet.getSheetByName("Historical Sales")
var fieldRange = \["B12:X"\]
var fieldValue = fieldRange.map(f =\>
formSheet.getRange(f).getValue())
//console.log(fieldValue)
dataSheet.appendRow(fieldValue)
};
function exp5() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('W12').activate();
var currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.PREVIOUS).activate();
currentCell.activateAsCurrentCell();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Historical Receipts'), true);
spreadsheet.getRange('X963').activate();
spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).activate();
spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.UP).activate();
spreadsheet.getRange('A14:V23').activate();
spreadsheet.getRange('Receipt!B12:W21').copyTo(spreadsheet.getActiveRange(),
SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};
This is how I'd do it:
//Not tested, but it can give you a direction
function moveData () {
var formSheet = spreadsheet.getSheetByName("Receipt");
var formRng = formSheet.getRange(); //Specify the data range here
var formData = formRng.getValues();
var dataSheet = spreadsheet.getSheetByName("Historical Sales");
//It gets the first empty row in column A and "pastes" the data set (form Data) .
datasheet.getRange(datasheet.getLastRow()+1,1,formData.length,formData[0].length).setValues(formData);
}

Trigger onEdit(e) does not trigger

When I've tried just to setValue("random") to some cell with this trigger it does work, but when I've tried to execute this code(for returning certain sheet names from selected spreadsheet) it doesn't work! When I run that chunk of code as separate function it does work and return sheets normally.
So, why it doesn't execute part of code from "//RETURNING JUST BUILDING LIST" part when I change value in D2 cell?
function onEdit(e) {
var range = e.range;
var rangeEdit = e.range.getA1Notation();
if(rangeEdit == "D2"){
//RETURNING JUST BUILDING LIST
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.getSheetsByName("OVERVIEW").getRange('A2').setValue("OK")
var sRNG = ss.getSheetByName("KEYS").getRange('A1:A12').getValues();
for (var z=0; z<sRNG.length; z++)
if (sRNG[z][0] == ss.getSheetByName("OVERVIEW").getRange('G3').getValue()) {
var xyz = z + 1;
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = ss.getSheetByName("OVERVIEW").getRange(1, 8, 50, 1);
range.clear();
var shArray = [];
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var spreadSheetsInA =
SpreadsheetApp.openByUrl(ss.getSheetByName("KEYS").getRange('B' + xyz).getValue()).getSheets();
shArray = spreadSheetsInA.map(function(sheet) {
return [sheet.getName()];
});
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = ss.getSheetByName("OVERVIEW").getRange(1, 8, shArray.length, 1);
range.setValues(shArray);
var rDEL = 1
for (var xdel = 0; xdel<shArray.length; xdel++){
if(shArray[xdel][0].indexOf("Overview")>-1 | shArray[xdel][0].indexOf("Cashflow")>-1 | shArray[xdel][0].indexOf("Dates")>-1){
var delSHT = ss.getSheetByName("OVERVIEW");
delSHT.getRange('H' + rDEL).clear();
}
rDEL++
}
}
}
Even when I've tried this, it doesn't work...
function onEdit(e) {
var range = e.range;
var rangeEdit = e.range.getA1Notation();
if(rangeEdit == "D2"){
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.getSheetsByName("OVERVIEW").getRange("A2").setValue("ok")
}
}
Basically, I just need to execute code if value in D2 in sheet Overview is changed!

google-apps script - loops

I have a project I been working on to read data from one sheet and iterate through the designated columns grab that data and place it on a template that will be uploaded to Google ads. See the code below (A SIMPLE LOOP IS NEEDED SEE MY CODE FOR COMMENTS!). Please note that i'm new to this and it may look like an eye sore. I been stuck on this for a while now trying literally everything I found with no success. if you need additional attachments or clarification please let me know.
//============================================================================*
// This program is an inventory based program that will create AdGroups based *
// On your current inventory Spreadsheet on your G-Drive *
// ===========================================================================*
function main() {
var feedCSVname = "FILE_NAME.csv"
var feedSheetName = "INVENTORY SHEET"
var TemplateURL = "SHEET_URL_HERE"
var Template_sheetName = "TEMPLATE_SHEET_NAME"
var push_sheetName = "Upload"
var done = "Done"
// ==== Parse CSV file and dump all contents to inventory sheet =========
var feedFile = DriveApp.getFilesByName(feedCSVname).next();
var feedData = Utilities.parseCsv(feedFile.getBlob().getDataAsString());
var Template = SpreadsheetApp.openByUrl(TemplateURL);
var feedSheet = Template.getSheetByName(feedSheetName);
feedSheet.clear().getRange(1, 1, feedData.length, feedData[0].length).setValues(feedData);
// Create a new columns "Status" so we can loop through
feedSheet.getRange('BI1').setValue('Status');
//==================== Feed Column Locations ============================
var CidColumn = 2;
var sellingPriceColumn = 10;
var yearColumn = 13;
var makeColumn = 14;
var modelColumn = 15;
var trimColumn = 16;
var dealernameColumn = 39;
var countofmakemodelyearColumn = 47;
var lowest_priceColumn = 52;
var mm_lowest_priceColumn = 53;
var m_lowest_priceColumn = 54;
var URL1Column = 58;
var URL2Column = 59;
var URL3Column = 60;
var status = 61;
var feedRows = 2 // Since row 1 has headers
var lastrow = feedSheet.getLastRow();
//======================= Feed Row Data ================================
var sellingPrice = feedSheet.getRange(feedRows, sellingPriceColumn).getValue();
var year = feedSheet.getRange(feedRows, yearColumn).getValue();
var make = feedSheet.getRange(feedRows, makeColumn).getValue();
var model = feedSheet.getRange(feedRows, modelColumn).getValue();
var dealername = feedSheet.getRange(feedRows, dealernameColumn).getValue();
var URL1 = feedSheet.getRange(feedRows, URL1Column).getValue();
var URL2 = feedSheet.getRange(feedRows, URL2Column).getValue();
var URL3 = feedSheet.getRange(feedRows, URL3Column).getValue();
//==================== Write Data To Template ==========================
// I need to loop this process
var templateSheet = Template.getSheetByName(Template_sheetName);
templateSheet.getRange('B2').setValue("Campaign Name");
templateSheet.getRange('B3').setValue(make);
templateSheet.getRange('B4').setValue(model);
templateSheet.getRange('B5').setValue(year);
templateSheet.getRange('D2').setValue(URL1);
templateSheet.getRange('D3').setValue(URL2);
templateSheet.getRange('D4').setValue(URL3);
feedSheet.getRange(feedRows, status).setValue(done);
// when this column and row = "Done" then go to next row
var readStatusColumn = feedSheet.getRange(feedRows, status).getValue();
if (readStatusColumn == done) {
//Then go to next row loop process
}
//================ Copy all data to push sheet =========================
//Copy contents of the Template sheet and paste to the Upload sheet
var copyRange = templateSheet.getRange('A8:J113');
var pushSheet = Template.getSheetByName(push_sheetName);
var paste2pushSheet = pushSheet.getRange(pushSheet.getLastRow() + 1, 1);
copyRange.copyTo(paste2pushSheet, {
contentsOnly: true
});
//End Loop
}

Google Sheets Script for passing a few cell values on one sheet to new sheet row

I have looked and looked and tried to adapt some scripts but am stuck.
Can someone help/show me how to add a collection of specific cells on one sheet and populate the next available row on a second sheet with these values? Please. This is what I have:
function AddToDB2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("PurchaseOrder");
var targetSheet = target.getSheetByName("DataBase");
var range = ss.getDataRange();
var values = range.getValues();
var date1 = values[1][6]; //these values are collected from multiple cells not in a specific row or col
var po = values[2][6];
var vendor = values[7][0];
var shipto = values[7][3];
//this was for testing that the values were grabbed correctly.
var data = [date1,po,vendor,shipto];
// I don't think this part is even close
var lastRow = targetSheet.getLastRow()
var rowData = values[0]
var newData = []
for(n=1;n<lastRow;++n){newData.push(rowData)}
targetSheet.getRange("C2:H"+lastRow).setValues(newData);
}
This is the other way I came up with:
function addToDB() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("PurchaseOrder");
var targetSheet = target.getSheetByName("DataBase");
var sourceRangePO = sourceSheet.getRange("G3");
var poValues = sourceRangePO.getValues();
if(poValues != "") {
var sourceRangeDate = sourceSheet.getRange("G2");
var targetRangeDate = targetSheet.getRange("A2");
var dateValues = sourceRangeDate.getValues();
targetRangeDate.setValues(dateValues);
var sourceRangePO = sourceSheet.getRange("G3");
var targetRangePO = targetSheet.getRange("B2");
var poValues = sourceRangePO.getValues();
targetRangePO.setValues(poValues);
var sourceRangeVendor = sourceSheet.getRange("A8");
var targetRangeVendor = targetSheet.getRange("C2");
var vendorValues = sourceRangeVendor.getValues();
targetRangeVendor.setValues(vendorValues);
var sourceRangeShipTo = sourceSheet.getRange("D8");
var targetRangeShipTo = targetSheet.getRange("D2");
var shipToValues = sourceRangeShipTo.getValues();
targetRangeShipTo.setValues(shipToValues);
targetSheet.insertRowAfter(1);
Browser.msgBox("Your PO has beed saved!");
}
else { Browser.msgBox("Please enter a PO number"); }
}
You were very close. Try this. I was a little confused by your setValues C:H. You only have 4 values to set. I set them in D-G. You can adjust as needed.
function AddToDB2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("PurchaseOrder");
var targetSheet = ss.getSheetByName("DataBase");
var range = sourceSheet.getDataRange();
var values = range.getValues();
var date1 = values[1][6]; //these values are collected from multiple cells not in a specific row or col
var po = values[2][6];
var vendor = values[7][0];
var shipto = values[7][3];
var data = [date1,po,vendor,shipto];
var lastRow = targetSheet.getLastRow()
var newData = []
for(n=0;n<data.length;++n){newData.push([data[n]])}
var rng =targetSheet.getRange(lastRow+1,1,1,4) // Col A-D
rng.setValues([newData]);
}

Google App Script Spreadsheet

here is the code
function makeaCVdoc(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var startRow = 2;
var numRows = sheet.getLastRow() -1;
var EMAIL_SENT = "EMAIL_SENT";
var subject = "Here is your CV";
//var dataRange = sheet.getRange(2,2,numRows,50);
var data = dataRange.getValues();
for(var i = 0; i < data.length; ++i)
{
var row = data[i];
var firstname = row[1];
var secondname = row[2];
var thiredname = row[3];
var address = row[4]
var email_address = row[5];
var homenumber = row[6];
var mobilenumber= row[7];
var objective = row[8];
var language = row[9];
var educationwithdegree = row[10];
var computerskill = row[11];
var TrainingCourse = row[12];
var Hobbies = row[13];
var DOB = row[14];
var nationality = row[15];
var MaritalStatus = row[16]
var emailSent = row[17];
var CVdoc = DocumentApp.create(firstname+' '+secondname+' '+thiredname);
var par1 = CVdoc.getBody().appendParagraph(firstname+' '+secondname+' '+thiredname);
par1.setHeading(DocumentApp.ParagraphHeading.TITLE);
var par2 = CVdoc.getBody().appendParagraph("Address: ");
par2.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(address);
var par3 = CVdoc.getBody().appendParagraph("Email Address: ");
par3.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(email_address);
var par4 = CVdoc.getBody().appendParagraph("Home Number: ");
par4.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(homenumber);
var par5 = CVdoc.getBody().appendParagraph("Mobile Number: ");
par5.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(mobilenumber);
var par6 = CVdoc.getBody().appendParagraph("Objective: ");
par6.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(objective);
var par7 = CVdoc.getBody().appendParagraph("Spoken Languages: ");
par7.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(language);
var par8 = CVdoc.getBody().appendParagraph("Education and Degree: ");
par8.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(educationwithdegree);
var par9 = CVdoc.getBody().appendParagraph("Computer Skills: ");
par9.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(computerskill);
var par10 = CVdoc.getBody().appendParagraph("Training Courses: ");
par10.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(TrainingCourse);
var par11 = CVdoc.getBody().appendParagraph("Hobbies: ");
par11.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(Hobbies);
var par12 = CVdoc.getBody().appendParagraph("Nationality: ");
par12.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(nationality);
var par13 = CVdoc.getBody().appendParagraph("Date Of Birth: ");
par13.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(DOB);
var par14 = CVdoc.getBody().appendParagraph("Marital Status: ");
par14.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(MaritalStatus);
var url = CVdoc.getUrl();
var body = 'Link to your doc: ' + url +'Thank you for using our Tech';
if(emailSent != EMAIL_SENT)
{
//GmailApp.sendEmail(email_address, subject, body);
//sheet.getRange(2,17).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
it's basically a form that i want to use to get all the information that it's needed in order to make a CV and after the user enter all the information and submit the form it's stored at a spreadsheet than i have this code inside this spreadsheet but something wrong with the comment lines and i still don't know why
i get something wrong with the getRange() command
which lead to another code error at the GmailApp command
right now i made them as comments
but no matter what i do i don't know what's wrong
so please could anyone help me
some said that they needed more information about the error
like i said the error is at the commented lines
var dataRange = sheet.getRange(2,2,numRows,50);
GmailApp.sendEmail(email_address, subject, body);
sheet.getRange(2,17).setValue(EMAIL_SENT);
it basically tell me error at line whatever the line is
and write the line to me as a function
what i mean is getRange(number,number,number,number);
and that's all what i get nothing more nothing less
this is the code after i changed it
function makeaCVdoc()
{
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var startRow = 2;
var numRows = sheet.getLastRow() -1;
var EMAIL_SENT = "EMAIL_SENT";
var subject = "Here is your CV";
var dataRange = sheet.getRange("B2:R2");
var data = dataRange.getValues();
for(var i = 0; i < data.length; ++i)
{
var row = data[i];
var firstname = row[0];
var secondname = row[1];
var thiredname = row[2];
var address = row[3]
var email_address = row[4];
var homenumber = row[5];
var mobilenumber= row[6];
var objective = row[7];
var language = row[8];
var educationwithdegree = row[9];
var computerskill = row[10];
var TrainingCourse = row[11];
var Hobbies = row[12];
var DOB = row[13];
var nationality = row[14];
var MaritalStatus = row[15]
var emailSent = row[16];
var CVdoc = DocumentApp.create(firstname+' '+secondname+' '+thiredname);
var par1 = CVdoc.getBody().appendParagraph(firstname+' '+secondname+' '+thiredname);
par1.setHeading(DocumentApp.ParagraphHeading.TITLE);
var par2 = CVdoc.getBody().appendParagraph("Address: ");
par2.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(address);
var par3 = CVdoc.getBody().appendParagraph("Email Address: ");
par3.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(email_address);
var par4 = CVdoc.getBody().appendParagraph("Home Number: ");
par4.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(homenumber);
var par5 = CVdoc.getBody().appendParagraph("Mobile Number: ");
par5.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(mobilenumber);
var par6 = CVdoc.getBody().appendParagraph("Objective: ");
par6.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(objective);
var par7 = CVdoc.getBody().appendParagraph("Spoken Languages: ");
par7.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(language);
var par8 = CVdoc.getBody().appendParagraph("Education and Degree: ");
par8.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(educationwithdegree);
var par9 = CVdoc.getBody().appendParagraph("Computer Skills: ");
par9.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(computerskill);
var par10 = CVdoc.getBody().appendParagraph("Training Courses: ");
par10.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(TrainingCourse);
var par11 = CVdoc.getBody().appendParagraph("Hobbies: ");
par11.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(Hobbies);
var par12 = CVdoc.getBody().appendParagraph("Nationality: ");
par12.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(nationality);
var par13 = CVdoc.getBody().appendParagraph("Date Of Birth: ");
par13.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(DOB);
var par14 = CVdoc.getBody().appendParagraph("Marital Status: ");
par14.setHeading(DocumentApp.ParagraphHeading.HEADING2);
CVdoc.getBody().appendParagraph(MaritalStatus);
CVdoc.saveAndClose();
var CVdocID = CVdoc.getId();
var url = CVdoc.getUrl();
var pdf = DocsList.getFileById(CVdocID).getAs("application/pdf");
var body = 'Here is your CV ' + pdf +'Thank you for using our Tech';
if(emailSent != EMAIL_SENT)
{
GmailApp.sendEmail(email_address, subject, body);
sheet.getRange("r2").setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
sheet.deleteRow(2);
}
I'm not sure how to fix what you have going on, I suspect it is structure and the fact that you're pulling 50 columns in your getRange, but really only need 17 of them (possible column width error?) Here is a script I use to procedurally generate a document from a form submission. In my case, I delete the document when I'm finished, but you'd leave it there and collect the URL and enclose it in the email you spit out. You can also use chained functions to repeat some of the repetitive tasks like copyBody.replaceText("text", variable), but if I gave you my version of that, it is more confusing since I use a lot of for() iterators, and the data in that example comes from UiApp not a form and spreadsheet combo.
function onFormSubmit(e) { // add an onsubmit trigger
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getLastRow();
//Set Unique ID for each entry
sheet.getRange(row,2).setValue(row);
// Full name and email address values come from the spreadsheet form
var email_address = "myemail#somewhere.com";//used as a reporting email for errors
var userName = e.values[1];
var date = e.values[2];
var vendor = e.values[3];
var coordinator = e.values[4];
var buyer = e.values[5];
var category = e.values[7];
var submittedBy = e.values[79];
//Values from form
var line1 = e.values[9];
var item1 = e.values[10];
var quantity1 = e.values[11];
var sku1 = e.values[12];
var price1 = e.values[13];
var total1 = e.values[14];
var line2 = e.values[16];
var item2 = e.values[17];
var quantity2 = e.values[18];
var sku2 = e.values[19];
var price2 = e.values[20];
var total2 = e.values[21];
var line3 = e.values[23];
var item3 = e.values[24];
var quantity3 = e.values[25];
var sku3 = e.values[26];
var price3 = e.values[27];
var total3 = e.values[28];
var line4 = e.values[30];
var item4 = e.values[31];
var quantity4 = e.values[32];
var sku4 = e.values[33];
var price4 = e.values[34];
var total4 = e.values[35];
var line5 = e.values[37];
var item5 = e.values[38];
var quantity5 = e.values[39];
var sku5 = e.values[40];
var price5 = e.values[41];
var total5 = e.values[42];
var line6 = e.values[44];
var item6 = e.values[45];
var quantity6 = e.values[46];
var sku6 = e.values[47];
var price6 = e.values[48];
var total6 = e.values[49];
var line7 = e.values[51];
var item7 = e.values[52];
var quantity7 = e.values[53];
var sku7 = e.values[54];
var price7 = e.values[55];
var total7 = e.values[56];
var line8 = e.values[58];
var item8 = e.values[59];
var quantity8 = e.values[60];
var sku8 = e.values[61];
var price8 = e.values[62];
var total8 = e.values[63];
var line9 = e.values[65];
var item9 = e.values[66];
var quantity9 = e.values[67];
var sku9 = e.values[68];
var price9 = e.values[69];
var total9 = e.values[70];
var line10 = e.values[72];
var item10 = e.values[73];
var quantity10 = e.values[74];
var sku10 = e.values[75];
var price10 = e.values[76];
var total10 = e.values[77];
var sumRange = sheet.getRange(1,86,sheet.getLastRow(),1);
sumRange.setNumberFormat("0,000,000.00");
sheet.getRange(row,86,1,1).setNumberFormat("0,000,000.00");
var sum = Math.round(100*(sheet.getRange(row,86,1,1).getValue())/100);
Logger.log(sum);
sheet.getRange(row,86,1,1).setNumberFormat("0,000,000.00");
Logger.log(sum);
//Document variables
var docTemplate = "Doc Id for your template document to replace text"; // *** replace with your template ID ***
var todaysDate = Utilities.formatDate(new Date(), "GMT", "MM/dd/yyyy");
var docName = "CV Document name " +userName +" on " +todaysDate;
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DocsList.getFileById(docTemplate)
.makeCopy(docName)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getActiveSection();
// Replace place holder keys this can be iterated with a number of for() loops
// Template Header
copyBody.replaceText('keyDate', date);
copyBody.replaceText('keyVendor', vendor);
copyBody.replaceText('keyCoordinator', coordinator);
copyBody.replaceText('keyBuyer', buyer);
copyBody.replaceText('keyCategory', category);
//Template Table
copyBody.replaceText('keyLine1', line1);
copyBody.replaceText('keyItem1', item1);
copyBody.replaceText('keyQuantity1', quantity1);
copyBody.replaceText('keySKU1', sku1);
copyBody.replaceText('keyPrice1', price1);
copyBody.replaceText('keyTotal1', total1);
copyBody.replaceText('keyLine1', line1);
copyBody.replaceText('keyItem1', item1);
copyBody.replaceText('keyQuantity1', quantity1);
copyBody.replaceText('keySKU1', sku1);
copyBody.replaceText('keyPrice1', price1);
copyBody.replaceText('keyTotal1', total1);
copyBody.replaceText('keyLine2', line2);
copyBody.replaceText('keyItem2', item2);
copyBody.replaceText('keyQuantity2', quantity2);
copyBody.replaceText('keySKU2', sku2);
copyBody.replaceText('keyPrice2', price2);
copyBody.replaceText('keyTotal2', total2);
copyBody.replaceText('keyLine3', line3);
copyBody.replaceText('keyItem3', item3);
copyBody.replaceText('keyQuantity3', quantity3);
copyBody.replaceText('keySKU3', sku3);
copyBody.replaceText('keyPrice3', price3);
copyBody.replaceText('keyTotal3', total3);
copyBody.replaceText('keyLine4', line4);
copyBody.replaceText('keyItem4', item4);
copyBody.replaceText('keyQuantity4', quantity4);
copyBody.replaceText('keySKU4', sku4);
copyBody.replaceText('keyPrice4', price4);
copyBody.replaceText('keyTotal4', total4);
copyBody.replaceText('keyLine5', line5);
copyBody.replaceText('keyItem5', item5);
copyBody.replaceText('keyQuantity5', quantity5);
copyBody.replaceText('keySKU5', sku5);
copyBody.replaceText('keyPrice5', price5);
copyBody.replaceText('keyTotal5', total5);
copyBody.replaceText('keyLine6', line6);
copyBody.replaceText('keyItem6', item6);
copyBody.replaceText('keyQuantity6', quantity6);
copyBody.replaceText('keySKU6', sku6);
copyBody.replaceText('keyPrice6', price6);
copyBody.replaceText('keyTotal6', total6);
copyBody.replaceText('keyLine7', line7);
copyBody.replaceText('keyItem7', item7);
copyBody.replaceText('keyQuantity7', quantity7);
copyBody.replaceText('keySKU7', sku7);
copyBody.replaceText('keyPrice7', price7);
copyBody.replaceText('keyTotal7', total7);
copyBody.replaceText('keyLine8', line8);
copyBody.replaceText('keyItem8', item8);
copyBody.replaceText('keyQuantity8', quantity8);
copyBody.replaceText('keySKU8', sku8);
copyBody.replaceText('keyPrice8', price8);
copyBody.replaceText('keyTotal8', total8);
copyBody.replaceText('keyLine9', line9);
copyBody.replaceText('keyItem9', item9);
copyBody.replaceText('keyQuantity9', quantity9);
copyBody.replaceText('keySKU9', sku9);
copyBody.replaceText('keyPrice9', price9);
copyBody.replaceText('keyTotal9', total9);
copyBody.replaceText('keyLineA', line10);
copyBody.replaceText('keyItemA', item10);
copyBody.replaceText('keyQuantityA', quantity10);
copyBody.replaceText('keySKUA', sku10);
copyBody.replaceText('keyPriceA', price10);
copyBody.replaceText('keyTotalA', total10);
copyBody.replaceText('keySum', +sum);
// Save and close the temporary document
copyDoc.saveAndClose();
// Convert temporary document to PDF by using the getAs blob conversion
var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
// Attach PDF and send the email
var subject = "CV submitted by "+submittedBy;
var body = userName +" has submitted a new CV, which is attached to this email.\nPlease ensure there are no errors before printing.\nIf there are errors, please notify: "+email_address +"\n\n";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
// Delete temp file
DocsList.getFileById(copyId).setTrashed(true);//remove this if you added URL above for posterity
}
If you're interested I can post the iterator version of this code that makes loops for repetitive actions. Just let me know. It's a lot more complex than this example because there are a lot of function calls, but if you're comfortable with that, I'll put it up.
I know for a fact that this code will make an invoice type/shipping label document because my template is built that way. I did not change the code to your variables and needs. You will also need to build a template document with keys to replace with each user's entry values, but that isn't terribly hard. All of the formatting can be done there, and you can add headings and such in the script that read from submitted data columns so if the section (such as nationality) is left blank there's no heading or content for it.
You're looking for technique #3 in this tutorial http://googleappsdeveloper.blogspot.com/2011/10/4-ways-to-do-mail-merge-using-google.html for a guide on how to do the script I provided.
Also, be careful with body.replaceText() using keys that are numbers. When you get to 10, it will replace the text with keyText1 and add a 0 string to the end. I'd recommend using alphabet letters or words instead for your keyValues.
Here is the iterated function version of the same basic process. Ignore the UiApp lines and remove the app methods, and it will work like a form. I'm including it as an alternative to show how you can use for loops to construct a document from a template without having to hand-code it all. It's also more modular, so if I need to change something, I can just add or modify that function and not mess with the rest of it.
function doPost(e){
var app = UiApp.getActiveApplication();
var vertPanel = app.createVerticalPanel();
var grantName = e.parameter.grantName;
var userEmail = Session.getActiveUser().getEmail();
var mrNumber = e.parameter.MR;
var ss = SpreadsheetApp.openById("Id for the form response spreadsheet");
var infoSheet = ss.getSheetByName('name of the form response sheet');
var keyRow = selectKeysByGrant(grantName);
var keyHeaders = infoSheet.getRange(1,1,1,infoSheet.getLastColumn()).getValues();
var infoData = infoSheet.getRange(keyRow,1,1,infoSheet.getLastColumn()).getValues();
var keyIds = new Array (makeKeys(keyHeaders));
var dataVars = new Array (makeDataVars(keyIds));
var copyId = assignKeys(dataVars,keyIds,infoData,userEmail,mrNumber);
var pdf = mailCheatSheet(copyId,userEmail,mrNumber);
var completeLabel = app.createLabel('You should receive your worksheet results in your email soon.');
app.add(completeLabel);
return app;
}
//Select Data Row from funding type
function selectKeysByGrant(grantName){
var grant = null;
switch (grantName){
case "1":
grant = 2
break;
case "2":
grant = 3
break;
case "3":
grant = 4
break;
case "4":
grant = 5
break;
}
return grant;
}
function makeKeys(keyHeaders){
var keys = [];
for (var i = 0; i< keyHeaders[0].length; i++){
keys.push("key"+keyHeaders[0][i]);
}
return keys;
}
function makeDataVars(keyIds){
var dataVarLabels = [];
for (var k = 0; k < keyIds[0].length; k++){
dataVarLabels.push(keyIds[0][k] +"text");
}
return dataVarLabels;
}
function assignKeys(dataVars,keyIds,infoData,userEmail,mrNumber){
var variables = dataVars;
var keys = keyIds;
var rowData = infoData;
var userEmail = userEmail;
var date = Utilities.formatDate(new Date, "CST","MM/dd/yyyy");
var mrNum = mrNumber;
Logger.log(variables);
Logger.log(keys);
Logger.log(rowData);
var docTemplate = "ID of your document template";
var todaysDate = Utilities.formatDate(new Date(), "GMT", "MM/dd/yyyy");
var docName = "New name of document created submitted by " +userEmail +" on " +todaysDate;
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DocsList.getFileById(docTemplate).makeCopy(docName).getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getActiveSection();
for (n = 1; n < variables[0].length; n++){
copyBody.replaceText(keys[0][n].toString(),rowData[0][n].toString())
}
//replacing some text from the UIapp but isn't on the spreadsheet
copyBody.replaceText('keyUserEmail',userEmail);
copyBody.replaceText('keyDate',date);
copyBody.replaceText('keyMR',mrNum);
// Save and close the temporary document
copyDoc.saveAndClose();
return copyId;
}
function mailCheatSheet(copyId,userEmail,mrNumber){
var copyId = copyId;
var userEmail = userEmail;
var mrNum = mrNumber;
// Convert temporary document to PDF by using the getAs blob conversion
var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
// Attach PDF and send the email
var subject = "SA Funding request by: "+userEmail;
var body = userEmail +" has submitted a document for " +mrNumber +", which is attached to this email.\nPlease ensure there are no errors before printing.\nIf there are errors, please notify: myself#xyz.com.\n\n";
MailApp.sendEmail(userEmail, subject, body, {name: 'CV Helperbot', htmlBody: body, attachments: pdf});
// Delete temp file
DocsList.getFileById(copyId).setTrashed(true);
return pdf;
}

Categories