Slow Archiving Google Apps Script - performance

I'm working on a finances tracking sheet and have the entry part of it completed, and working fine. The problem is, it runs very slowly as it goes line by line in most cases. Aside from it being a lot of code, I can't figure out how to speed it up or batch anything together. Additionally, the braces for the beginning and ending of the function in question are not connected (they are both colored red when the cursor is next to them), which I can't understand. Can anyone help clean up my code a bit to speed this up?
Here is the function in question:
function onClickSubmit(e) {
var wkbk = SpreadsheetApp.getActiveSpreadsheet();
var ss = wkbk.getSheetByName("Entry");
//Bank Details Move
var bankDeposit = ss.getRange(3,9).getValue();
var bankWithdrawal = ss.getRange(3,10).getValue();
var bankDate = ss.getRange(3,12).getValue();
var targetSheet = wkbk.getSheetByName("BANK DS");
if(bankDate != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var bankAmt = (bankDeposit - bankWithdrawal);
var bankDetail = [[bankDate, bankAmt]];
targetSheet.getRange(targetRow,1,1,2).setValues(bankDetail);
targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
ss.getRange(3,9,1,4).clearContent();
}
//Work Chits Move
var work1Hours = ss.getRange(5,9).getValue();
var work1Job = ss.getRange(5,10).getValue();
var work1Rate = ss.getRange(5,11).getValue();
var work1Date = ss.getRange(5,12).getValue();
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work1Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work1Detail = [[work1Date,work1Job,work1Hours,work1Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work1Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(5,9,1,4).clearContent();
}
var work2Hours = ss.getRange(6,9).getValue();
var work2Job = ss.getRange(6,10).getValue();
var work2Rate = ss.getRange(6,11).getValue();
var work2Date = ss.getRange(6,12).getValue();
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work2Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work2Detail = [[work2Date,work2Job,work2Hours,work2Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work2Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(6,9,1,4).clearContent();
}
var work3Hours = ss.getRange(7,9).getValue();
var work3Job = ss.getRange(7,10).getValue();
var work3Rate = ss.getRange(7,11).getValue();
var work3Date = ss.getRange(7,12).getValue();
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work3Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work3Detail = [[work3Date,work3Job,work3Hours,work3Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work3Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(7,9,1,4).clearContent();
}
//Receipts Move
var i = 9
var reDate = ss.getRange(i,12).getValue()
var targetSheet = wkbk.getSheetByName("RECEIPTS DS");
if (reDate !=""){
while (reDate !="") {
var reAmt = ss.getRange(i,9).getValue();
var rePlace = ss.getRange(i,10).getValue();
var reCat = ss.getRange(i,11).getValue();
var reDate = ss.getRange(i,12).getValue();
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var reDetail = [[reDate,rePlace,reCat,reAmt]];
targetSheet.getRange(targetRow,1,1,4).setValues(reDetail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(i,9,1,4).clearContent();
i++
}
}
//Safe Move 3, 9, 13 (dates) 3-8, 9-12, 13-18
var safeDate = ss.getRange(3,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=3;i<9;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
// targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(3,6).clearContent();
//Safe Move 9 (rolls) 3-8, 9-12, 13-18
var safeDate = ss.getRange(9,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=9;i<13;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(9,6).clearContent();
//Safe Move (loose) 13-18
var safeDate = ss.getRange(13,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=13;i<19;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(13,6).clearContent();
}
Here is a copy of the Sheet for you to see how it works: https://docs.google.com/spreadsheets/d/1Ij7DPqQnVAR9cCpqZRf6QFUIKfgrvLvj-y5gyUPKJMw/edit?usp=sharing
Thanks in advance!
UPDATE
I accepted the more thorough of the two answers, but both offered excellent insight. While this answer has the most helpful information, the other answer added a lot as well. For anyone interested, I used a lot of these edits, and also worked at removing the calls to SpreadsheetApp methods by calling them outside of loops/if tests, and then building arrays of the results. The combination of these two answers sped up the code by about 400%, so thank you to both of you!
To further help anyone who is interested in speeding up Google Script code, here is my modified function
Note, I did have to keep in one instance of "A1:A" vs. getLastRow() because in that particular target sheet there are a number of columns with information in them that need to be ignored:
function onClickSubmit(e) {
var wkbk = SpreadsheetApp.getActiveSpreadsheet();
var ss = wkbk.getSheetByName("Entry");
//Bank Details Move
var t=ss.getRange(3,9,1,4).getValues()[0];
var bankDeposit = t[0];
var bankWithdrawal = t[1];
var bankDate = t[3];
var targetSheet = wkbk.getSheetByName("BANK DS");
if(bankDate != ""){
var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length + 1;
var bankAmt = (bankDeposit - bankWithdrawal);
var bankDetail = [[bankDate, bankAmt]];
targetSheet.getRange(targetRow,1,1,2).setValues(bankDetail);
targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
ss.getRange(3,9,1,4).clearContent();
}
//Work Chits Move
var vals=ss.getRange(5,9,3,4).getValues();
var work1Hours = vals[0][0];
var work1Job = vals[0][1];
var work1Rate = vals[0][2];
var work1Date = vals[0][3];
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work1Date != ""){
var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length +1;
var work1Detail = [[work1Date,work1Job,work1Hours,work1Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work1Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(5,9,1,4).clearContent();
targetRow = targetRow + 1;
}
var work2Hours = vals[1][0];
var work2Job = vals[1][1];
var work2Rate = vals[1][2];
var work2Date = vals[1][3];
if(work2Date != ""){
var work2Detail = [[work2Date,work2Job,work2Hours,work2Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work2Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(6,9,1,4).clearContent();
targetRow = targetRow + 1;
}
var work3Hours = vals[2][0];
var work3Job = vals[2][1];
var work3Rate = vals[2][2];
var work3Date = vals[2][3];
if(work3Date != ""){
var work3Detail = [[work3Date,work3Job,work3Hours,work3Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work3Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(7,9,1,4).clearContent();
targetRow = targetRow + 1
}
//Receipts Move
var i = 0
var targetSheet = wkbk.getSheetByName("RECEIPTS DS");
var reDetail = [];
var reVals=ss.getRange(9,9,20,4).getValues();
var reDate = reVals[0,3]
var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length + 1;
if (reDate !=""){
while (reVals[i][3] !="") {
var reAmt = reVals[i][0];
var rePlace = reVals[i][1];
var reCat = reVals[i][2];
var reDate = reVals[i][3];
var reDetailNew = [[reDate, rePlace, reCat, reAmt]];
var reDetail = reDetail.concat(reDetailNew);
i=i+1
}
targetSheet.getRange(targetRow,1,i,4).setValues(reDetail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,i,3));
ss.getRange(9,9,i+1,4).clearContent();
//Safe Move (bills)
var targetSheet = wkbk.getSheetByName("SAFE DS");
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var safeVals = ss.getRange(3,2,16,5).getValues();
var safeDate = safeVals[0][4];
for (var i=0;i<6;i++){
var safeIn = safeVals[i][0];
var safeOut = safeVals[i][2];
var safeCnt = (safeIn - safeOut);
var safeType = safeVals[i][1];
if(safeCnt != 0){
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
targetRow = targetRow + 1;
}
}
//Safe Move (rolls)
var safeDate = safeVals[6][4];
for (var i=6;i<10;i++){
var safeIn = safeVals[i][0];
var safeOut = safeVals[i][2];
var safeCnt = (safeIn - safeOut);
var safeType = safeVals[i][1];
if(safeCnt != 0){
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
targetRow = targetRow + 1;
}
}
//Safe Move (loose)
var safeDate = safeVals[10][4];
for (var i=10;i<16;i++){
var safeIn = safeVals[i][0];
var safeOut = safeVals[i][2];
var safeCnt = (safeIn - safeOut);
var safeType = safeVals[i][1];
if(safeCnt != 0){
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
targetRow = targetRow + 1;
}
}
ss.getRange(3,2,16,1).clearContent();
ss.getRange(3,4,16,1).clearContent();
ss.getRange(3,6,16,1).clearContent();
}
}

Here's some suggestions:
I put my suggestions as comments below your code.
In general avoid the use of getValue() use getValues() instead it returns a 2D array of data. Read the documentation and also look at the returned values in the debugger so that you really understand what you data looks like: [[row0],[row1],[row2]....]
and avoid the use of A1 notations of the form A1:A. Use Sheet.getRange(1,1,Sheet.getLastRow().... instead.
function onClickSubmit(e) {
var wkbk = SpreadsheetApp.getActiveSpreadsheet();
var ss = wkbk.getSheetByName("Entry");
//Bank Details Move
var bankDeposit = ss.getRange(3,9).getValue();
var bankWithdrawal = ss.getRange(3,10).getValue();
var bankDate = ss.getRange(3,12).getValue();
var targetSheet = wkbk.getSheetByName("BANK DS");
//var t=ss.getRange(3,9,1,4).getValues()[0];
//var bankDeposit = t[0];
//var bankWithdrawal = t[1];
//var bankDate = t[3];
//var targetSheet = wkbk.getSheetByName("BANK DS");
if(bankDate != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();//This often returns nulls between data last row and max rows
var targetRow = Avals.filter(String).length + 1;
//var targetRow = targetSheet.getRange(1,1,targetSheet.getLastRow()).getValues().length;
var values = ss.getRange("A:A").getValues();//Same problem as described above
var bankAmt = (bankDeposit - bankWithdrawal);
var bankDetail = [[bankDate, bankAmt]];
targetSheet.getRange(targetRow,1,1,2).setValues(bankDetail);
targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
ss.getRange(3,9,1,4).clearContent();
}
//Work Chits Move
var work1Hours = ss.getRange(5,9).getValue();
var work1Job = ss.getRange(5,10).getValue();
var work1Rate = ss.getRange(5,11).getValue();
var work1Date = ss.getRange(5,12).getValue();
//try as above to get data all at once
//var vals=ss.getRange(5,9,1,4).getValues();
//then use vals[0]...
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work1Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work1Detail = [[work1Date,work1Job,work1Hours,work1Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work1Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(5,9,1,4).clearContent();
}
var work2Hours = ss.getRange(6,9).getValue();
var work2Job = ss.getRange(6,10).getValue();
var work2Rate = ss.getRange(6,11).getValue();
var work2Date = ss.getRange(6,12).getValue();
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work2Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work2Detail = [[work2Date,work2Job,work2Hours,work2Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work2Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(6,9,1,4).clearContent();
}
var work3Hours = ss.getRange(7,9).getValue();
var work3Job = ss.getRange(7,10).getValue();
var work3Rate = ss.getRange(7,11).getValue();
var work3Date = ss.getRange(7,12).getValue();
var targetSheet = wkbk.getSheetByName("WORK DS");
if(work3Date != ""){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var work3Detail = [[work3Date,work3Job,work3Hours,work3Rate]];
targetSheet.getRange(targetRow,1,1,4).setValues(work3Detail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(7,9,1,4).clearContent();
}
//Receipts Move
var i = 9
var reDate = ss.getRange(i,12).getValue()
var targetSheet = wkbk.getSheetByName("RECEIPTS DS");
if (reDate !=""){
while (reDate !="") {
var reAmt = ss.getRange(i,9).getValue();
var rePlace = ss.getRange(i,10).getValue();
var reCat = ss.getRange(i,11).getValue();
var reDate = ss.getRange(i,12).getValue();
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var reDetail = [[reDate,rePlace,reCat,reAmt]];
targetSheet.getRange(targetRow,1,1,4).setValues(reDetail);
targetSheet.getRange(targetRow-1,5,1,3).copyTo(targetSheet.getRange(targetRow,5,1,3));
ss.getRange(i,9,1,4).clearContent();
i++
}
}
//Safe Move 3, 9, 13 (dates) 3-8, 9-12, 13-18
var safeDate = ss.getRange(3,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=3;i<9;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
// targetSheet.getRange(targetRow-1,3).copyTo(targetSheet.getRange(targetRow,3));
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(3,6).clearContent();
//Safe Move 9 (rolls) 3-8, 9-12, 13-18
var safeDate = ss.getRange(9,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=9;i<13;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(9,6).clearContent();
//Safe Move (loose) 13-18
var safeDate = ss.getRange(13,6).getValue();
var targetSheet = wkbk.getSheetByName("SAFE DS");
for (var i=13;i<19;i++){
var safeIn = ss.getRange(i,2).getValue();
var safeOut = ss.getRange(i,4).getValue();
var safeCnt = (safeIn - safeOut);
var safeType = ss.getRange(i,3).getValue();
if(safeCnt != 0){
//Finds first blank cell in column A, to enter new data in:
var Avals = targetSheet.getRange("A1:A").getValues();
var targetRow = Avals.filter(String).length + 1;
var values = ss.getRange("A:A").getValues();
var safeDetail = [[safeDate, safeType,safeCnt]];
targetSheet.getRange(targetRow,1,1,3).setValues(safeDetail);
ss.getRange(i,2).clearContent();
ss.getRange(i,4).clearContent();
}
}
ss.getRange(13,6).clearContent();
}

Your script is slow because it's making many calls to the SpreadsheetApp methods. To improve it's performance you should change the logic to reduce these calls and use Arrays to manipulate the data.
I.E. instead of using multiple getValue() use only one getValues(), you could even use getDatatRange() to get the "data range" (a range embracing all the cells having data including the blank cell between them) of a sheet, then use getValues() to get all the sheet values.
As a rule of thumb avoid using SpreadsheetApp methods inside loops (for, while, etc)

Related

Script runs too long after emails already sent

I am trying to have this code send emails faster and not hang up so much. Taking along time to end the script. How can I send the emails and end it quicker? That way if I need to send out more emails, it can run the whole script again.
function sendEmails() {
//Current spreadsheet emails are sent from
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Search Index").activate();
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
var RowCountEmailPresent = 0
for (var i = 5;i<=lr;i++) {
var currentEmail = ss.getRange(i, 2).getValue();
if (currentEmail.includes('#')) {
RowCountEmailPresent = RowCountEmailPresent + 1
}
}
var templateText = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Template").getRange(1, 1).getValue();
//How Many Sends We have left
var quotaLeft = MailApp.getRemainingDailyQuota();
if((RowCountEmailPresent) > quotaLeft){
Browser.msgBox("You have " + quotaLeft + "left and you're trying to send " + (lr-1) + " emails. Emails were not sent.");
}
else {
for (var i = 5;i<=lr;i++) {
//What values are being placed in the email
var currentEmail = ss.getRange(i, 2).getValue();
var ccmail = ss.getRange(i, 1).getValue();
var AlreadySent = ss.getRange(i, 3).getValue();
var currentStatus = ss.getRange(i, 7).getValue();
var currentOrdernumber = ss.getRange(i, 6).getValue();
var currentMon = ss.getRange(i, 6).getValue();
var code = ss.getRange(i, 13).getValue();
//Actual email being sent to Reps and TLs
var messageBody = templateText.replace("{Order Number}", currentMon).replace("{Jep Code}", code);
var subjectLine = "Offline Support - Order Status: " + currentStatus + " - Mon#: " + currentOrdernumber;
if (currentEmail.includes('#')) {
if (AlreadySent < 1){
MailApp.sendEmail(currentEmail, subjectLine, messageBody, {cc: ccmail})
ss.getRange(i, 3).setValue('1');
}
}
} // close for loop
} //close else statment
SpreadsheetApp.getUi().alert("Congratulations, your email has been sent", SpreadsheetApp.getUi().ButtonSet.OK);
}
See If this improves your efficiency.
var AlreadySent = ss.getRange(i, 3).getValue();
if (AlreadySent < 1){
var currentEmail = ss.getRange(i, 2).getValue();
if (currentEmail.includes('#')) {
var ccmail = ss.getRange(i, 1).getValue();
var currentStatus = ss.getRange(i, 7).getValue();
var currentOrdernumber = ss.getRange(i, 6).getValue();
var currentMon = ss.getRange(i, 6).getValue();
var code = ss.getRange(i, 13).getValue();
var messageBody = templateText.replace("{Order Number}", currentMon).replace("{Jep Code}", code);
var subjectLine = "Offline Support - Order Status: " + currentStatus + " - Mon#: " + currentOrdernumber;
MailApp.sendEmail(currentEmail, subjectLine, messageBody, {cc: ccmail})
ss.getRange(i, 3).setValue('1');
}
}

Script Not Operating Independent of Other Scripts

I have set up a rough script (new to this) to automate some data entry that I have to do consistently. I build a UI with checkboxes and have data fill into the sheet based on the responses to the checks. It all works correctly for one product. The problem is that I have duplicated this for other products. When recreated for a second product, I have to rename the function in the second script to "BUILDUI2" in order to see the correct options display (otherwise it displays the options from the previous script). Then, even though I see the correct check boxes, the responses to the check boxes are based off of the first script created. So on the second product, selecting the second checkbox inserts the data specified in the original BuildUI script that is tied to the other product rather than the data shown under BuildUI2.
These are independent scripts activated by separate push buttons on the sheet.
Any insight on how to get the second (and third, and fourth) scripts to read the correct information?
Product 1 Script:
function BuildUI() {
//create the application itself
var app = UiApp.createApplication().setHeight(160).setWidth(250);
app.setTitle("Options");
//create panels and add them to the UI
var panel = app.createVerticalPanel();
//create a text box
var check1 = app.createCheckBox("Safety Aprons");
check1.setName('CheckBox1');
var check2 = app.createCheckBox("Standard Trash Racks (1)");
check2.setName('CheckBox2');
var check3 = app.createCheckBox("Standard Trash Racks (2) ");
check3.setName('CheckBox3');
var check4 = app.createCheckBox("Plate Style Trash Racks (1)");
check4.setName('CheckBox4');
var check5 = app.createCheckBox("Plate Style Trash Racks (2) ");
check5.setName('CheckBox5');
var check6 = app.createCheckBox("6:1 Safety Grates (1)");
check6.setName('CheckBox6');
var check7 = app.createCheckBox("6:1 Safety Grates (2)");
check7.setName('CheckBox7');
//create a submit button
var button = app.createButton('Done');
//add the text box and the button to the panel
panel.add(check1);
panel.add(check2);
panel.add(check3);
panel.add(check4);
panel.add(check5);
panel.add(check6);
panel.add(check7);
panel.add(button);
var handler = app.createServerHandler("submitButton");
button.addClickHandler(handler);
handler.addCallbackElement(panel);
//add the panel to the application
app.add(panel);
var doc = SpreadsheetApp.getActive();
doc.show(app);
}
function submitButton(e){
var app = UiApp.getActiveApplication();
var sheet = SpreadsheetApp.getActiveSheet();
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox1 == 'true') {
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = lastrow-4; i <= numRows - 1; i++) {
var row = values[i];
if (row[2] == 'R012M-BAM' || row[2] == 'R012M-BAF') {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;}
}
var lastrow = sheet.getLastRow();
sheet.getRange(lastrow+1,3).setValue("R012M-BSAF6");
sheet.getRange(lastrow+1,5).setValue("1");
sheet.getRange(lastrow+2,3).setValue("R012M-BSAM6");
sheet.getRange(lastrow+2,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox2 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00092");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox3 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00092");
sheet.getRange(lastrow+1,5).setValue("2");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox4 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00094");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox5 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00094");
sheet.getRange(lastrow+1,5).setValue("2");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox6 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00095");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox7 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00095");
sheet.getRange(lastrow+1,5).setValue("2");
}
return app.close();
}
Product 2 Script:
function BuildUI2() {
//create the application itself
var app = UiApp.createApplication().setHeight(225).setWidth(250);
app.setTitle("Options");
//create panels and add them to the UI
var panel = app.createVerticalPanel();
//create a text box
var check1 = app.createCheckBox("Safety Aprons");
check1.setName('CheckBox1');
var check2 = app.createCheckBox("Pipe Style Trash Racks (1)");
check2.setName('CheckBox2');
var check3 = app.createCheckBox("Pipe Style Trash Racks (2) ");
check3.setName('CheckBox3');
var check4 = app.createCheckBox("Plate Style Trash Racks (1)");
check4.setName('CheckBox4');
var check5 = app.createCheckBox("Plate Style Trash Racks (2) ");
check5.setName('CheckBox5');
var check6 = app.createCheckBox("Bull Nose Style Trash Racks (1)");
check6.setName('CheckBox6');
var check7 = app.createCheckBox("Bull Nose Style Trash Racks (2) ");
check7.setName('CheckBox7');
var check8 = app.createCheckBox("6:1 Safety Grates (1)");
check8.setName('CheckBox8');
var check9 = app.createCheckBox("6:1 Safety Grates (2)");
check9.setName('CheckBox9');
//create a submit button
var button = app.createButton('Done');
//add the text box and the button to the panel
panel.add(check1);
panel.add(check2);
panel.add(check3);
panel.add(check4);
panel.add(check5);
panel.add(check6);
panel.add(check7);
panel.add(check8);
panel.add(check9);
panel.add(button);
var handler = app.createServerHandler("submitButton");
button.addClickHandler(handler);
handler.addCallbackElement(panel);
//add the panel to the application
app.add(panel);
var doc = SpreadsheetApp.getActive();
doc.show(app);
}
function submitButton(e){
var app = UiApp.getActiveApplication();
var sheet = SpreadsheetApp.getActiveSheet();
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox1 == 'true') {
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = lastrow-4; i <= numRows - 1; i++) {
var row = values[i];
if (row[2] == 'R015M-BAM' || row[2] == 'R015M-BAF') {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;}
}
var lastrow = sheet.getLastRow();
sheet.getRange(lastrow+1,3).setValue("R015M-BSAF6");
sheet.getRange(lastrow+1,5).setValue("1");
sheet.getRange(lastrow+2,3).setValue("R015M-BSAM6");
sheet.getRange(lastrow+2,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox2 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00194");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox3 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00194");
sheet.getRange(lastrow+1,5).setValue("2");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox4 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00097");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox5 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00097");
sheet.getRange(lastrow+1,5).setValue("2");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox6 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00440");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox7 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00440");
sheet.getRange(lastrow+1,5).setValue("2");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox8 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00101");
sheet.getRange(lastrow+1,5).setValue("1");
}
var lastrow = sheet.getLastRow();
if(e.parameter.CheckBox9 == 'true')
{sheet.getRange(lastrow+1,3).setValue("85-00101");
sheet.getRange(lastrow+1,5).setValue("2");
}
return app.close();
}

Multiple Dataset AmstockChart with multiple Axis [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 7 years ago.
Improve this question
I want to implement multiple value axis in following amchart sample:
https://www.amcharts.com/demos/multiple-data-sets/
Multiple axis example: http://www.amcharts.com/tips/multiple-value-axes-stock-chart/
I tried a lot but I think I miss some minor thing.
Is there any way to combine above charts (multi value and multi data Set) and create a multiple value axis multiple data sets Chart?
Examples with jsfiddle will work best for me. Thanks :)
I did this myself. Hope this becomes helpful to someone. Here is the solution:
AmCharts.ready(function () {
generateChartData();
createStockChart();
});
var colors = [
"#FF6600", "#B0DE09", "#FCD202", "#2A0CD0",
"#CD0D74", "#CC0000", "#00CC00", "#0000CC", "#DDDDDD",
"#999999", "#333333", "#990000", "#0D8ECF"
];
var chartData1 = [];
var chartData2 = [];
var chartData3 = [];
var chartData4 = [];
function generateChartData() {
var firstDate = new Date();
firstDate.setDate(firstDate.getDate() - 500);
firstDate.setHours(0, 0, 0, 0);
for (var i = 0; i < 500; i++) {
var newDate = new Date(firstDate);
newDate.setDate(newDate.getDate()+i);
newDate.setHours(0, 0, 0, 0);
var value1 = Math.round(Math.random() * (40 + i)) + 100 + i;
var value2 = Math.round(Math.random() * (100 + i)) + 200 + i;
var value3 = Math.round(Math.random() * (100 + i)) + 200;
var value4 = Math.round(Math.random() * (100 + i)) + 200 + i;
chartData1.push({date: newDate,value1: value1});
chartData2.push({date: newDate,value2: value2});
chartData3.push({date: newDate,value3: value3});
chartData4.push({date: newDate,value4: value4});
}
}
function createStockChart() {
var chart = new AmCharts.AmStockChart();
chart.pathToImages = "http://www.amcharts.com/lib/3/images/";
var dataSet1 = new AmCharts.DataSet();
dataSet1.fieldMappings = [{fromField: "value1", toField: "value1"}];
dataSet1.dataProvider = chartData1;
dataSet1.categoryField = "date";
dataSet1.title = "Value1";
dataSet1.color = colors[0];
var dataSet2 = new AmCharts.DataSet();
dataSet2.fieldMappings = [{fromField: "value2", toField: "value2"}];
dataSet2.dataProvider = chartData2;
dataSet2.categoryField = "date";
dataSet2.title = "Value2";
dataSet2.color = colors[1];
var dataSet3 = new AmCharts.DataSet();
dataSet3.fieldMappings = [{fromField: "value3", toField: "value3"}];
dataSet3.dataProvider = chartData3;
dataSet3.categoryField = "date";
dataSet3.title = "Value3";
dataSet3.color = colors[2];
var dataSet4 = new AmCharts.DataSet();
dataSet4.fieldMappings = [{fromField: "value4", toField: "value4"}];
dataSet4.dataProvider = chartData4;
dataSet4.categoryField = "date";
dataSet4.title = "Value4";
dataSet4.color = colors[3];
// set data sets to the chart
chart.dataSets = [dataSet1,dataSet2,dataSet3,dataSet4];
// PANELS ///////////////////////////////////////////
// first stock panel
var stockPanel = new AmCharts.StockPanel();
stockPanel.recalculateToPercents = "never";
stockPanel.title = "Volume";
var categoryAxesSettings = new AmCharts.CategoryAxesSettings();
categoryAxesSettings.minPeriod = "DD";
chart.categoryAxesSettings = categoryAxesSettings;
// apply custom style for value axes
var valueAxesSettings = new AmCharts.ValueAxesSettings();
valueAxesSettings.axisAlpha = 1;
valueAxesSettings.gridThickness = 0;
valueAxesSettings.axisThickness = 2;
valueAxesSettings.inside = false;
chart.valueAxesSettings = valueAxesSettings;
// apply custom style for panels settings
var panelsSettings = new AmCharts.PanelsSettings();
panelsSettings.marginLeft = 100;
panelsSettings.marginRight = 100;
chart.panelsSettings = panelsSettings;
// add first value axes
var valueAxis1 = new AmCharts.ValueAxis();
valueAxis1.axisColor = colors[0];
valueAxis1.color = colors[0];
valueAxis1.offset = 0;
stockPanel.addValueAxis(valueAxis1);
// add second value axes
var valueAxis2 = new AmCharts.ValueAxis();
valueAxis2.axisColor = colors[1];
valueAxis2.color = colors[1];
valueAxis2.offset = 0;
valueAxis2.position = "right";
stockPanel.addValueAxis(valueAxis2);
// add third value axes
var valueAxis3 = new AmCharts.ValueAxis();
valueAxis3.axisColor = colors[2];
valueAxis3.color = colors[2];
valueAxis3.offset = 50;
stockPanel.addValueAxis(valueAxis3);
// add fourth value axes
var valueAxis4 = new AmCharts.ValueAxis();
valueAxis4.axisColor = colors[3];
valueAxis4.color = colors[3];
valueAxis4.offset = 50;
valueAxis4.position = "right";
stockPanel.addValueAxis(valueAxis4);
// graph of first stock panel
var graph1 = new AmCharts.StockGraph();
graph1.valueField = "value1";
graph1.comparable = true;
graph1.title = "Value1";
graph1.useDataSetColors = false;
graph1.lineColor = colors[0];
graph1.bullet = "round";
graph1.bulletBorderColor = "#FFFFFF";
graph1.bulletBorderAlpha = 1;
graph1.balloonText = "[[title]]:<b>[[value]]</b>";
graph1.compareGraphBalloonText = "[[title]]:<b>[[value]]</b>";
graph1.compareGraphBullet = "round";
graph1.compareGraphBulletBorderColor = "#FFFFFF";
graph1.compareGraphBulletBorderAlpha = 1;
graph1.valueAxis = valueAxis1;
stockPanel.addStockGraph(graph1);
// graph of second stock panel
var graph2 = new AmCharts.StockGraph();
graph2.valueField = "value2";
graph2.comparable = true;
graph2.title = "Value2";
graph2.useDataSetColors = false;
graph2.lineColor = colors[1];
graph2.bullet = "round";
graph2.bulletBorderColor = "#FFFFFF";
graph2.bulletBorderAlpha = 1;
graph2.balloonText = "[[title]]:<b>[[value]]</b>";
graph2.compareGraphBalloonText = "[[title]]:<b>[[value]]</b>";
graph2.compareGraphBullet = "round";
graph2.compareGraphBulletBorderColor = "#FFFFFF";
graph2.compareGraphBulletBorderAlpha = 1;
graph2.valueAxis = valueAxis2;
stockPanel.addStockGraph(graph2);
// graph of third stock panel
var graph3 = new AmCharts.StockGraph();
graph3.valueField = "value3";
graph3.comparable = true;
graph3.title = "Value3";
graph3.useDataSetColors = false;
graph3.lineColor = colors[2];
graph3.bullet = "round";
graph3.bulletBorderColor = "#FFFFFF";
graph3.bulletBorderAlpha = 1;
graph3.balloonText = "[[title]]:<b>[[value]]</b>";
graph3.compareGraphBalloonText = "[[title]]:<b>[[value]]</b>";
graph3.compareGraphBullet = "round";
graph3.showEventsOnComparedGraphs = true;
graph3.compareGraphBulletBorderColor = "#FFFFFF";
graph3.compareGraphBulletBorderAlpha = 1;
graph3.valueAxis = valueAxis3;
stockPanel.addStockGraph(graph3);
// graph of fourth stock panel
var graph4 = new AmCharts.StockGraph();
graph4.comparable = true;
graph4.valueField = "value4";
graph4.title = "Value4";
graph4.useDataSetColors = false;
graph4.lineColor = colors[3];
graph4.bullet = "round";
graph4.bulletBorderColor = "#FFFFFF";
graph4.bulletBorderAlpha = 1;
graph4.balloonText = "[[title]]:<b>[[value]]</b>";
graph4.compareGraphBalloonText = "[[title]]:<b>[[value]]</b>";
graph4.compareGraphBullet = "round";
graph4.compareGraphBulletBorderColor = "#FFFFFF";
graph4.compareGraphBulletBorderAlpha = 1;
graph4.valueAxis = valueAxis4;
stockPanel.addStockGraph(graph4);
// create stock legend
var stockLegend1 = new AmCharts.StockLegend();
stockLegend1.periodValueTextComparing = "[[percents.value.close]]%";
stockLegend1.periodValueTextRegular = "[[value.close]]";
stockPanel.stockLegend = stockLegend1;
var periodSelector = new AmCharts.PeriodSelector();
periodSelector.periods = [
{period: "DD",count: 5,label: "5 day"},{period: "DD",count: 10,label: "10 days"},
{period: "MM",count: 1,label: "1 month",selected: true}, {period: "YYYY",count: 1,label: "1 year"},
{period: "YTD",label: "YTD"}, {period: "MAX",label: "MAX"}];
periodSelector.position = "left";
chart.periodSelector = periodSelector;
// DATA SET SELECTOR
var dataSetSelector = new AmCharts.DataSetSelector();
dataSetSelector.position = "left";
chart.dataSetSelector = dataSetSelector;
// set panels to the chart
chart.panels = [stockPanel];
// OTHER SETTINGS ////////////////////////////////////
var sbsettings = new AmCharts.ChartScrollbarSettings();
sbsettings.backgroundColor = "#222";
sbsettings.selectedBackgroundColor = "#555";
sbsettings.selectedGraphFillAlpha = 1;
chart.chartScrollbarSettings = sbsettings;
var chartScrollbar = new AmCharts.ChartScrollbar();
chartScrollbar.autoGridCount = true;
chartScrollbar.scrollbarHeight = 40;
chart.chartScrollbar = chartScrollbar;
// CURSOR settings
var cursorSettings = new AmCharts.ChartCursorSettings();
cursorSettings.valueBalloonsEnabled = true;
cursorSettings.cursorAlpha = 0.5;
cursorSettings.valueLineBalloonEnabled = true;
cursorSettings.valueLineEnabled = true;
cursorSettings.valueLineAlpha = 0.5;
cursorSettings.cursorPosition = "mouse";
chart.chartCursorSettings = cursorSettings;
var categoryAxis = new AmCharts.CategoryAxis();
chart.categoryAxis = categoryAxis;
chart.write('chartdiv');
}
body{
font-size:12px;
color:#000000;
background-color:#ffffff;
font-family:verdana,helvetica,arial,sans-serif;
}
.amChartsButtonSelected{
background-color:#CC0000;
border-style:solid;
border-color:#CC0000;
border-width:1px;
color:#FFFFFF;
-moz-border-radius: 5px;
border-radius: 5px;
margin: 1px;
}
.amChartsButton{
background-color:#EEEEEE;
border-style:solid;
border-color:#CCCCCC;
border-width:1px;
color:#000000;
-moz-border-radius: 5px;
border-radius: 5px;
margin: 1px;
}
.amChartsCompareList{
border-style:solid;
border-color:#CCCCCC;
border-width:1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://www.amcharts.com/lib/3/amcharts.js" type="text/javascript"></script>
<script src="http://www.amcharts.com/lib/3/serial.js" type="text/javascript"></script>
<script src="http://www.amcharts.com/lib/3/amstock.js" type="text/javascript"></script>
<div id="chartdiv" style="width: 100%; height: 500px;"></div>

nativescript: new object is not an new an empty opject

As example only.
I have:
var ListingModel = require("~/shared/view-models/listing-view-model");
function listing10(){
var Listing = new ListingModel.ListingViewModel();
Listing.horizontalAddData('10');
frameModule.topmost().navigate("/views/listing/list");
}
function listing20(){
var Listing = new ListingModel.ListingViewModel();
Listing.horizontalAddData('20');
frameModule.topmost().navigate("/views/listing/list");
}
function listing50(){
var Listing = new ListingModel.ListingViewModel();
Listing.horizontalAddData('50');
frameModule.topmost().navigate("/views/listing/list");
}
exports.listing10 = listing10;
exports.listing20 = listing20;
exports.listing50 = listing50;
When i now tap on event listing10 i receive all information which i require.
But, when i now tap event listing20 i become back the information from listing10 and listing20. That means, the the new object isnt a new object with cleared data?
Question: How i must call the new ListingModel.ListingViewModel(); so that i really become back a new, clear ListingViewModel Object?
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Model = require('~/shared/view-models/view-model');
var ListingViewModel = (function (_super) {
__extends(ListingViewModel, _super);
function ListingViewModel() {
_super.apply(this, arguments);
}
var params = {start: 0 , limit: 7};
var page = 0;
var _listRequested = new virtualArray.VirtualArray(7);
_listRequested.loadSize = params.limit;
var _fetch = new f.fetchHelper();
var loading = 0;
var that=this;
var indexes = [];
var horizontalindex = [];
var fetchlist = [];
var listing ='';
Object.defineProperty(ListingViewModel.prototype, "list", {
get: function () {
return _listRequested;
},
enumerable: true,
configurable: true
});
ListingViewModel.prototype.horizontalAddData = function(val) {
listing = val;
that.loadItems();
};
loadItems = function (args) {
if(loading == 1) return;
loading = 1;
fetchlist = [];
var url = config.apiUrl + '?t=listing'
+ '&listing=' + list
+ '&start=' + params.start
+ '&limit=' + params.limit;
_fetch.getJSON(url).then(function (res) {
try {
for (var i = 0; i < res.list.length; i++) {
var am = new Model.Model(res.list[i]);
fetchlist.push(am);
}
_listRequested.length = _listRequested.length + fetchlist.length;
_listRequested.load(params.start, fetchlist);
} catch (e) {
alert('error' + e);
}
params.start = params.start + params.limit;
loading = 0;
});
};
return ListingViewModel;
})(observable.Observable);
exports.ListingViewModel = ListingViewModel;

BIRT maintain line break in 1 cell only

I am trying to keep the line break inside one cell only, however it's still not working after i do the change below and export it to excel.
The change is to replace end of a list by "<br style="mso-data-placement:same-cell;/>"
var reUselessTags = /(<.{0,1}body|<.{0,1}FONT|<.{0,1}TEXTFORMAT|<img|<.{0,1}div|<.{0,1}list).{0,}?>/g;
var reRemoveScript = /<script.{0,}?<\/script>/g;
var reList = /<LI.{0,}?>/g;
var reListParagraphStart = /<(LI|P).{0,}?>/g;
var reListParagraphEnd = /<(\/LI|\/P).{0,}?>/g;
var reBreak = /<BR.{0,}?>/g;
var reDoubleLineBreak = /\r+/g;
var reOpenLineBreak = /^\r/g;
var resStr = row["DESCRIPTION"];
resStr = resStr.replace(reUselessTags,'');
resStr = resStr.replace(reRemoveScript,'');
resStr = resStr.replace(reBreak,'');
resStr = resStr.replace(reDoubleLineBreak,'');
resStr = resStr.replace(reOpenLineBreak,'');
resStr = resStr.replace(newLine, '');
resStr = resStr.replace(reList, '');
resStr = resStr.replace(reListParagraphStart,'');
resStr = resStr.replace(reListParagraphEnd,'<br style="mso-data-placement:same-cell;" />');
result

Resources