Skip to content

Instantly share code, notes, and snippets.

@saroarhossain57
Created August 26, 2025 13:22
Show Gist options
  • Select an option

  • Save saroarhossain57/31dc6cb128bd6d2b3e997412b4c957cb to your computer and use it in GitHub Desktop.

Select an option

Save saroarhossain57/31dc6cb128bd6d2b3e997412b4c957cb to your computer and use it in GitHub Desktop.
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