Invoice Details
GST/26-27/
Auto-set from sheet
Party Details
Products / Services
| # | Product / Service Name | HSN | Unit | Qty | Rate (Rs.) | Amount (Rs.) |
|---|
Subtotal: Rs.0.00
GST & Charges
Total GSTRs.0.00
Grand TotalRs.0.00
Ph : +91-44-2647 3001
Mobile : +91-98406 67361
E-mail : plusmarkinc@gmail.com
Mobile : +91-98406 67361
E-mail : plusmarkinc@gmail.com
#66, O-Block, Anna Nagar East, Chennai - 600 102. Tamilnadu - INDIA.
GSTIN : 33AFLPM2733C1ZT
TAX INVOICE
CASH / CREDIT
BILL TO
SHIP TO
PARTY's GSTIN :
| S.No. | NAME OF THE PRODUCT / SERVICE | HSN CODE | UNIT | QTY. | RATE | AMOUNT Rs. | Ps. |
|---|
Signature of Receiver with Seal
Certified that the particulars given above are true and correct.
PLUS MARK GLOBAL
Authorised Signatory
No Google Sheet URL saved yet. Go to Settings tab, add your Web App URL and save.
Enter your Google Sheet URL in Settings, then click "Refresh from Sheet".
Apps Script must be updated to support both saving and loading.
Replace your current Apps Script code with the new version below, then redeploy.
Replace your current Apps Script code with the new version below, then redeploy.
Updated Apps Script Code
Go to your Google Sheet → Extensions → Apps Script → replace ALL code with this → Save → Deploy as New Deployment → copy URL below.
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Invoices") || ss.insertSheet("Invoices");
// ── Handle DELETE action ──
if (data.action === "delete") {
var lastRow = sheet.getLastRow();
if (lastRow < 2) return ContentService.createTextOutput(JSON.stringify({status:"ok"})).setMimeType(ContentService.MimeType.JSON);
var invNos = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
for (var d = 0; d < invNos.length; d++) {
if (String(invNos[d][0]) === String(data.invno)) {
sheet.deleteRow(d + 2);
return ContentService.createTextOutput(JSON.stringify({status:"ok"})).setMimeType(ContentService.MimeType.JSON);
}
}
return ContentService.createTextOutput(JSON.stringify({status:"error",message:"Invoice not found"})).setMimeType(ContentService.MimeType.JSON);
}
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Invoice No","Date","Bill To","Ship To","Party GSTIN",
"Vehicle No","E-Way Bill","Transport","State","Items JSON",
"Subtotal","CGST%","CGST Amt","SGST%","SGST Amt",
"IGST%","IGST Amt","Total GST","Round Off","Reserve",
"Grand Total","Amount in Words","Saved At"]);
}
// Check if invoice already exists — update if so
var lastRow = sheet.getLastRow();
var updated = false;
if (lastRow > 1) {
var invNos = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
for (var i = 0; i < invNos.length; i++) {
if (invNos[i][0] === data.invno) {
sheet.getRange(i + 2, 1, 1, 23).setValues([[
data.invno, data.date, data.billto, data.shipto,
data.party_gstin, data.vehicle, data.eway, data.transport,
data.state, JSON.stringify(data.items || []),
data.subtotal, data.cgst_rate, data.cgst_amt,
data.sgst_rate, data.sgst_amt, data.igst_rate, data.igst_amt,
data.total_gst, data.roundoff, data.reserve,
data.grand_total, data.rupees_words, new Date().toLocaleString("en-IN")
]]);
updated = true;
break;
}
}
}
if (!updated) {
sheet.appendRow([
data.invno, data.date, data.billto, data.shipto,
data.party_gstin, data.vehicle, data.eway, data.transport,
data.state, JSON.stringify(data.items || []),
data.subtotal, data.cgst_rate, data.cgst_amt,
data.sgst_rate, data.sgst_amt, data.igst_rate, data.igst_amt,
data.total_gst, data.roundoff, data.reserve,
data.grand_total, data.rupees_words, new Date().toLocaleString("en-IN")
]);
}
return ContentService.createTextOutput(JSON.stringify({status:"ok",updated:updated}))
.setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({status:"error",message:err.toString()}))
.setMimeType(ContentService.MimeType.JSON);
}
}
function doGet(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Invoices");
if (!sheet || sheet.getLastRow() < 2) {
return ContentService.createTextOutput(JSON.stringify({status:"ok",rows:[]}))
.setMimeType(ContentService.MimeType.JSON);
}
var data = sheet.getDataRange().getValues();
var headers = data[0];
var rows = [];
for (var i = 1; i < data.length; i++) {
var obj = {};
for (var j = 0; j < headers.length; j++) {
obj[headers[j]] = data[i][j];
}
rows.push(obj);
}
return ContentService.createTextOutput(JSON.stringify({status:"ok",rows:rows}))
.setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({status:"error",message:err.toString()}))
.setMimeType(ContentService.MimeType.JSON);
}
}