Invoice Details

GST/26-27/
Auto-set from sheet

Party Details

Products / Services

#Product / Service Name HSNUnit QtyRate (Rs.) Amount (Rs.)
Subtotal: Rs.0.00

GST & Charges

Total GSTRs.0.00
Grand TotalRs.0.00
Plus Mark Global
Ph : +91-44-2647 3001
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
INVOICE No. :
GST/26-27/0001
DATE OF SUPPLY :
VEHICLE No. :
E-WAY BILL No.
TRANSPORTATION MODE :
STATE :
PARTY's GSTIN :
S.No.NAME OF THE PRODUCT / SERVICE HSN CODEUNITQTY. RATEAMOUNT
Rs.
Ps.
Received the above goods in good Condition
Signature of Receiver with Seal
Certified that the particulars given above are true and correct.
PLUS MARK GLOBAL
Seal
Authorised Signatory
Website : www.plusmarkglobal.org
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.

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);
  }
}

Web App URL