Created
August 26, 2025 13:22
-
-
Save saroarhossain57/31dc6cb128bd6d2b3e997412b4c957cb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var scriptProp = PropertiesService.getScriptProperties(); | |
| function intialSetup() { | |
| var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
| scriptProp.setProperty('key',activeSpreadsheet.getId()); | |
| } | |
| function doPost (e) { | |
| var sheetName = 'Hood Orders'; | |
| var sheetName2 = 'Accessory Orders'; | |
| var sheetName3 = 'Floating Shelf Orders'; | |
| var lock = LockService.getScriptLock(); | |
| lock.tryLock(10000); | |
| try { | |
| var order = JSON.parse(e.postData.contents); | |
| var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')); | |
| var sheet = doc.getSheetByName(sheetName); | |
| var sheet2 = doc.getSheetByName(sheetName2); | |
| var sheet3 = doc.getSheetByName(sheetName3); | |
| if ( order.order_source =='floating_shelves') { | |
| var headers = sheet3.getRange(1,1,1,sheet3.getLastColumn()).getValues()[0]; | |
| var nextRow = sheet3.getLastRow()+1; | |
| var newRow = headers.map(function(header){ | |
| return header === 'timestamp' ? new Date() : e.parameter[header]; | |
| }); | |
| var bol_name = "View BOL"; | |
| var shipping_name = "Shipping Label"; | |
| var packing_slip_name = "Packing Slip"; | |
| var bol_pdf = ''; | |
| if(order.bol_pdf) { | |
| bol_pdf = '=HYPERLINK("' + order.bol_pdf +'", "' + bol_name + '")'; | |
| } | |
| var shipping_label = ''; | |
| if (order.shipping_label) { | |
| shipping_label = '=HYPERLINK("' + order.shipping_label +'", "' + shipping_name + '")'; | |
| } | |
| var packing_slip_label = ''; | |
| if(order.packing_list) { | |
| packing_slip_label = '=HYPERLINK("' + order.packing_list +'", "' + packing_slip_name + '")'; | |
| } | |
| sheet3.appendRow([order.wo,order.order_date,order.o_a,order.pro,order.rts,order.shp,order.es_date,order.pro_date,order.source,order.order_title,order.priority,order.asc_priority,order.ship_method,order.shipping_address,bol_pdf,shipping_label,packing_slip_label,order.pick_up_line_extension,order.quantity,order.sku,order.wood_species,order.width,order.depth,order.float_thick,order.finish_grade,order.color,order.hypemill_confirmed,order.hypemill_billed,order.additional_notes]); | |
| } else if ( order.order_source =='accessory' ) { | |
| var headers = sheet2.getRange(1,1,1,sheet2.getLastColumn()).getValues()[0]; | |
| var nextRow = sheet2.getLastRow()+1; | |
| var newRow = headers.map(function(header){ | |
| return header === 'timestamp' ? new Date() : e.parameter[header]; | |
| }); | |
| var shipping_name = "UPS Label"; | |
| var shipping_label = '=HYPERLINK("' + order.label_1 +'", "' + shipping_name + '")'; | |
| sheet2.appendRow([order.wo,order.order_date,order.o_a,order.pro,order.rts,order.shp,order.es_date,order.pro_date,order.source,order.order_title,order.priority,order.ship_method,order.shipping_address,shipping_label,order.label_2,order.label_3,order.pick_up_line_extension,order.wood_specie,order.hood_style,order.apron_style,order.chimney_style,order.hood_width,order.hood_height,order.hood_depth,order.hood_finish_grade,order.chimney_color,order.custom_finish,order.buttons,order.extend_chimney,order.zline_solid_bottom,order.crown_molding,order.apron_molding_kits,order.chimney_strapping_kits,order.touch_up,order.wood_banding,order.hypemill_confirmed,order.hypemill_billed,order.additional_notes]); | |
| } else { | |
| var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0]; | |
| var nextRow = sheet.getLastRow()+1; | |
| var newRow = headers.map(function(header){ | |
| return header === 'timestamp' ? new Date() : e.parameter[header]; | |
| }); | |
| var bol_name = "View BOL"; | |
| var shipping_name = "Shipping Label"; | |
| var bol_pdf = ''; | |
| if(order.bol_pdf) { | |
| bol_pdf = '=HYPERLINK("' + order.bol_pdf +'", "' + bol_name + '")'; | |
| } | |
| var shipping_label = ''; | |
| if (order.shipping_label) { | |
| shipping_label = '=HYPERLINK("' + order.shipping_label +'", "' + shipping_name + '")'; | |
| } | |
| sheet.appendRow([order.wo,order.order_date,order.o_a,order.pro,order.rts,order.shp,order.es_date,order.pro_date,order.source,order.order_title,order.priority,order.ship_method,order.shipping_address,bol_pdf,shipping_label,order.packing_list,order.pick_up_line_extension,order.wood_specie,order.hood_style,order.apron_style,order.chimney_style,order.hood_width,order.hood_height,order.hood_depth,order.hood_finish_grade,order.chimney_color,order.apron_color,order.liner,order.blower,order.duct_kit,order.recircuiting_vnt_slots,order.reduce_height,order.arched_apron,order.custom_finish,order.molding_strapping,order.apron_banding,order.buttons,order.extend_chimney,order.zline_solid_bottom,order.crown_molding,order.molding_strapping_kit,order.touch_up,order.hypemill_confirmed,order.hypemill_billed,order.additional_notes,order.z_line_shipped,order.z_line_ordered,order.z_line_tracking]); | |
| } | |
| return ContentService.createTextOutput(JSON.stringify({'result':'success','row':nextRow})).setMimeType(ContentService.MimeType.JSON); | |
| } | |
| catch(e) { | |
| return ContentService.createTextOutput(JSON.stringify({'result':'error','error':e})).setMimeType(ContentService.MimeType.JSON); | |
| } | |
| finally{ | |
| lock.releaseLock(); | |
| } | |
| } | |
| function atEdit(e) { | |
| let row_data = row_values(e); | |
| if (!row_data) return; | |
| let response = get_bol_data(row_data); | |
| Logger.log(response); | |
| if (!response) return; | |
| let response_data = JSON.parse(response); | |
| switch (response_data.type) { | |
| case 'success': | |
| if(row_data.url != undefined){ | |
| set_value_on_success(response_data.pdf_link, response_data.shipping_link, 'bolFetching', e); | |
| }else{ | |
| set_value_on_success(response_data.response.bol_link, response_data.response.shipping_link, response_data.bol_ID, e); | |
| } | |
| break; | |
| case 'error': | |
| show_warning(e, "BOL could'nt be generated. This order is for Local Pickup"); | |
| break; | |
| default: | |
| return false; | |
| } | |
| } | |
| function onOpen(e) { | |
| SpreadsheetApp.getUi() // Or DocumentApp or FormApp. | |
| .createMenu('Shipping Address') | |
| .addItem('Enter Info', 'initDataCollection') | |
| .addToUi(); | |
| } | |
| function initDataCollection() { | |
| let promptResponse = openPropmt("Buyer's Name"); | |
| let resStatus = promptResponse.resStatus; | |
| let resText = promptResponse.resText; | |
| if (resStatus == 'CLOSE' || | |
| resStatus == 'CANCEL' || | |
| resStatus != 'OK' || | |
| resText == '') return false; | |
| let shippingData = {}; | |
| let followupRequiredFields = { | |
| 'companyName': 'Company Name', | |
| 'streetAddress': 'Street Address', | |
| 'city': "City", | |
| 'state': "State", | |
| 'zipCode': 'Zip Code', | |
| 'country': "Country", | |
| 'phoneNumber': 'Phone Number', | |
| } | |
| if (resText) { | |
| shippingData.buyerName = resText; | |
| for (const property in followupRequiredFields) { | |
| let promptResponse = openPropmt(followupRequiredFields[property]); | |
| let resStatus = promptResponse.resStatus; | |
| let resText = promptResponse.resText; | |
| if (resStatus == 'CLOSE' || | |
| resStatus == 'CANCEL' || | |
| resStatus != 'OK' || | |
| resText == '') break; | |
| if (resText) { | |
| shippingData[property] = resText; | |
| } else { | |
| break; | |
| } | |
| } | |
| } | |
| if (shippingData.buyerName && | |
| shippingData.companyName && | |
| shippingData.streetAddress && | |
| shippingData.city && | |
| shippingData.state && | |
| shippingData.zipCode && | |
| shippingData.country && | |
| shippingData.phoneNumber) { | |
| setShippingData(shippingData); | |
| } else { | |
| setShippingData(false); | |
| } | |
| } | |
| function setShippingData(data) { | |
| let {shippingAddress} = necessarySheetVariables(); | |
| let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
| let activeRange = sheet.getActiveRange(); | |
| let activeRow = activeRange.getRow(); | |
| let range = SpreadsheetApp.getActiveSpreadsheet().getRange(`${shippingAddress.column}${activeRow}`); | |
| range.setHorizontalAlignment("center"); | |
| range.setVerticalAlignment("middle"); | |
| if (data) { | |
| let shippingData = `${data.buyerName}\n${data.companyName}\n${data.streetAddress}\n${data.city}, ${data.state}, ${data.zipCode} ${data.country}\nT: ${data.phoneNumber}`; | |
| let clearRange = SpreadsheetApp.getActiveSpreadsheet().getRange(`N${activeRow}`); | |
| clearRange.clear(); | |
| range.setValue(shippingData); | |
| } else { | |
| range.setValue('Info is not completed yet. Please try again') | |
| } | |
| // Set the text middle of that cell | |
| range.setHorizontalAlignment("center"); | |
| range.setVerticalAlignment("middle"); | |
| } | |
| function openPropmt(requiredText) { | |
| let ui = SpreadsheetApp.getUi(); | |
| let propmt = ui.prompt(`${requiredText}?`, ui.ButtonSet.OK_CANCEL); | |
| let resStatus = propmt.getSelectedButton(); | |
| let resText = propmt.getResponseText(); | |
| return { | |
| resStatus, | |
| resText | |
| }; | |
| } | |
| function split_shipping_data(shipping_data, e) { | |
| let { spreadsheet, current_row } = get_event_data(e); | |
| let sheetVariables = necessarySheetVariables(); | |
| let values = spreadsheet.getRange(`${sheetVariables.range.start}${current_row}:${sheetVariables.range.end}${current_row}`).getValues(); | |
| let source = values[0][sheetVariables.source.rowIndex] ? values[0][sheetVariables.source.rowIndex] : null; | |
| let carrier = values[0][sheetVariables.carrier.rowIndex] ? values[0][sheetVariables.carrier.rowIndex] : null; | |
| if (source == 'USCD' && carrier == 'R&L'){ | |
| if (!shipping_data) return show_warning(e, "Shipping data is empty"); | |
| let shipping_array = shipping_data.split(/\n/); | |
| if (shipping_array.length <= 4) return show_warning(e, 'Field missing'); | |
| let location = shipping_array[3] ? shipping_array[3].split(',') : null; | |
| if (!location) return false; | |
| let shipping_obj = { | |
| 'name': shipping_array[0] ? shipping_array[0].trim() : null, | |
| 'company_name': shipping_array[1] ? shipping_array[1].trim() : null, | |
| 'address': shipping_array[2] ? shipping_array[2].trim() : null, | |
| 'city': location[0] ? location[0].trim() : null, | |
| 'state': location[1] ? location[1].trim() : null, | |
| 'zip': location[2] ? location[2].split(" ") ? location[2].trim().split(" ")[0].trim() : null : null, | |
| 'country': "USA", | |
| 'phone': shipping_array[4] ? shipping_array[4].trim().replace("T:", "").trim() : null, | |
| } | |
| let warning_msg = 'Field missing'; | |
| if (!shipping_obj.name || | |
| !shipping_obj.company_name || | |
| !shipping_obj.address || | |
| !shipping_obj.city || | |
| !shipping_obj.state || | |
| !shipping_obj.zip || | |
| !shipping_obj.country || | |
| !shipping_obj.phone) return show_warning(e, warning_msg); | |
| return shipping_obj; | |
| } | |
| } | |
| function row_values(e) { | |
| let { spreadsheet, current_row, current_sheet, current_column, active_sheet } = get_event_data(e); | |
| let sheetVariables = necessarySheetVariables(); | |
| if (current_sheet == sheetVariables.sheetTab) { | |
| if (current_column > sheetVariables.columnRestriction.columnIndex) return false; | |
| let hasValue = active_sheet.getRange(`${sheetVariables.bolRange.billOfLadingColumn}${current_row}`).getValues()[0][0]; | |
| // if value exist already, do nothing and return false | |
| if (hasValue) return false; | |
| if(current_column == sheetVariables.source.columnIndex || current_column == sheetVariables.carrier.columnIndex){ | |
| let values = spreadsheet.getRange(`${sheetVariables.range.start}${current_row}:${sheetVariables.range.end}${current_row}`).getValues(); | |
| let order_number = values[0][sheetVariables.orderNumber.rowIndex] ? values[0][sheetVariables.orderNumber.rowIndex] : null; | |
| let source = values[0][sheetVariables.source.rowIndex] ? values[0][sheetVariables.source.rowIndex] : null; | |
| let carrier = values[0][sheetVariables.carrier.rowIndex] ? values[0][sheetVariables.carrier.rowIndex] : null; | |
| // if source is Hoodsly or WWH proceed | |
| if(source == 'Hoodsly' || source == 'WWH'){ | |
| // if carrier is other than R&L then return | |
| if(carrier != 'R&L') return false; | |
| let orderToString = `${order_number}`; | |
| // if order number got anything other than integer number | |
| if(orderToString.match(/[^\d+]/g) != null) return show_warning(e,"Insert your order number as integer number."); | |
| let getUrl = hoodslyOrWWH(order_number, source); | |
| return { | |
| url: getUrl | |
| } | |
| } | |
| let shipping_data = split_shipping_data(values[0][sheetVariables.shippingAddress.rowIndex] ? values[0][sheetVariables.shippingAddress.rowIndex] : null, e) ? split_shipping_data(values[0][sheetVariables.shippingAddress.rowIndex] ? values[0][sheetVariables.shippingAddress.rowIndex] : null, e) : null; | |
| // if source is USCD and carrier is R&L then return following data | |
| if (source == 'USCD' && carrier == 'R&L'){ | |
| if (!order_number) return show_warning(e,"Order number is empty"); | |
| if (!shipping_data) return false; | |
| return { | |
| order_number, | |
| shipping_data, | |
| source, | |
| carrier | |
| } | |
| } | |
| } | |
| } else { | |
| return false; | |
| } | |
| } | |
| function hoodslyOrWWH(order_number, source){ | |
| let url = null; | |
| if(source == 'Hoodsly'){ | |
| url = "https://hoodsly.com/wp-json/generate_bol/v1/bol-fetching?orderID="+order_number+ ""; | |
| return url; | |
| }else if(source == 'WWH'){ | |
| url = "https://wholesalewoodhoods.com/wp-json/generate_bol/v1/bol-fetching?orderID="+order_number+ ""; | |
| return url; | |
| } | |
| return url; | |
| } | |
| function get_event_data(e) { | |
| return { | |
| spreadsheet: e.source, | |
| active_sheet: e.source.getActiveSheet(), | |
| range_obj: e.range, | |
| current_row: e.range.getRow(), | |
| current_column: e.range.getColumn(), | |
| current_sheet: e.source.getActiveSheet().getName() | |
| }; | |
| } | |
| function get_bol_data(data) { | |
| if(data.url != undefined){ | |
| if(data.url == "") return false; | |
| let response = UrlFetchApp.fetch(data.url); | |
| return response; | |
| } | |
| if (!data.order_number || | |
| !data.shipping_data || | |
| !data.source || | |
| !data.carrier) return false; | |
| let url = "https://hoodsly.com/wp-json/spreadsheet/v1/bol-generation"; | |
| let options = { | |
| 'method': 'post', | |
| 'contentType': 'application/json', | |
| 'payload': JSON.stringify(data) | |
| }; | |
| let response = UrlFetchApp.fetch(url, options); | |
| return response; | |
| }; | |
| function show_warning(e, msg) { | |
| let ui = SpreadsheetApp.getUi(); | |
| ui.alert(msg); | |
| return false; | |
| } | |
| function clear_warning(e) { | |
| let { active_sheet, current_row } = get_event_data(e) | |
| let {bolRange} = necessarySheetVariables(); | |
| let range = active_sheet.getRange(`${bolRange.billOfLadingColumn}${current_row}`); | |
| range.clear(); | |
| } | |
| function set_value_on_success(pdf_link, shipping_link, bol_ID, e) { | |
| let {bolRange} = necessarySheetVariables(); | |
| let { active_sheet, current_row } = get_event_data(e) | |
| let range = active_sheet.getRange(`${bolRange.billOfLadingColumn}${current_row}:${bolRange.shippingLabelColumn}${current_row}`); | |
| let pdfLink = ''; | |
| let shippingLink = ''; | |
| if(bol_ID == 'bolFetching'){ | |
| pdfLink = `=HYPERLINK("${pdf_link}", "View BOL")`; | |
| shippingLink = `=HYPERLINK("${shipping_link}", "Shipping Label")`; | |
| }else{ | |
| pdfLink = `=HYPERLINK("${pdf_link}", "WC${bol_ID}")`; | |
| shippingLink = `=HYPERLINK("${shipping_link}", "Shipping Label")`; | |
| } | |
| range.setValues([[pdfLink, shippingLink]]); | |
| range.setFontColor("cornflower blue"); | |
| range.setHorizontalAlignment("center"); | |
| range.setVerticalAlignment("middle"); | |
| } | |
| // necessarray column, row & index data to use across all the functions | |
| function necessarySheetVariables(){ | |
| return { | |
| range: { | |
| start: 'I', | |
| end: 'O' | |
| }, | |
| bolRange: { | |
| billOfLadingColumn: 'N', | |
| shippingLabelColumn: 'O' | |
| }, | |
| source: { | |
| column: 'I', | |
| rowIndex: 0, | |
| columnIndex: 9 | |
| }, | |
| carrier: { | |
| column: 'L', | |
| rowIndex: 3, | |
| columnIndex: 12 | |
| }, | |
| orderNumber: { | |
| column: 'J', | |
| rowIndex: 1 | |
| }, | |
| shippingAddress: { | |
| column: 'M', | |
| rowIndex: 4 | |
| }, | |
| columnRestriction: { | |
| column: 'L', | |
| columnIndex: 12 | |
| }, | |
| sheetTab: 'Hood Orders' | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment