function responder_(e, obj) { var out = JSON.stringify(obj); var cb = e && e.parameter && e.parameter.callback; if (cb && /^[A-Za-z0-9_]+$/.test(cb)) { return ContentService .createTextOutput(cb + "(" + out + ")") .setMimeType(ContentService.MimeType.JAVASCRIPT); } return ContentService .createTextOutput(out) .setMimeType(ContentService.MimeType.JSON); } function doGet(e) { return api_(e, (e && e.parameter) || {}); } function doPost(e) { var dados = {}; try { dados = JSON.parse((e.postData && e.postData.contents) || "{}"); } catch (err) { dados = (e && e.parameter) || {}; } return api_(e, dados); } function api_(e, p) { p = p || {}; var lock = LockService.getScriptLock(); lock.waitLock(15000); try { var action = p.action || ""; if (!action) { action = (p.nf || p.codigo) ? "add" : "ping"; } if (action === "ping") return responder_(e, { ok: true, app: "chegou", planilha: "sm" }); if (action === "list") return responder_(e, { ok: true, rows: listar_(), pessoas: pessoas_() }); if (action === "update") return responder_(e, atualizar_(p)); if (action === "retirar") return responder_(e, retirar_(p)); if (action === "delete") return responder_(e, apagar_(p)); return responder_(e, adicionar_(p)); } catch (err) { return responder_(e, { ok: false, error: String(err) }); } finally { lock.releaseLock(); } } var MESES = [ "JANEIRO", "FEVEREIRO", "MARÇO", "ABRIL", "MAIO", "JUNHO", "JULHO", "AGOSTO", "SETEMBRO", "OUTUBRO", "NOVEMBRO", "DEZEMBRO" ]; function ss_() { return SpreadsheetApp.getActiveSpreadsheet(); } function tz_() { return ss_().getSpreadsheetTimeZone() || "America/Sao_Paulo"; } function nomeMes_(data) { var n = Number(Utilities.formatDate(data || new Date(), tz_(), "M")) - 1; return MESES[n] || "AGOSTO"; } function abaMes_(data) { var ss = ss_(); var nome = nomeMes_(data); var sheet = ss.getSheetByName(nome) || ss.getSheetByName(nome.replace("Ç", "C")); if (!sheet) sheet = criarAba_(ss, nome); return sheet; } function criarAba_(ss, nome) { var sheet = ss.insertSheet(nome); sheet.getRange("A1").setValue("CONTROLE DE ENTREGAS DE CORRESPONDENCIAS (RECEBIDAS NA SM)"); sheet.getRange("A1").setFontWeight("bold").setFontSize(14); sheet.getRange("A2").setValue("REMETENTE"); sheet.getRange("B2").setValue("DESTINATARIO"); sheet.getRange("E2").setValue("DATA DE RECEBIMENTO"); sheet.getRange("H2").setValue("DESCRIÇÃO"); sheet.getRange("K2").setValue("NF"); sheet.getRange("L2").setValue("NOTIFICACAO"); sheet.getRange("N2").setValue("RECEBIDO POR"); sheet.getRange("O2").setValue("RETIRADOS"); sheet.getRange(2, 1, 1, 15).setFontWeight("bold").setBackground("#0c6b5c").setFontColor("white"); mesclarModelo_(sheet, 2); sheet.setColumnWidth(1, 140); sheet.setColumnWidth(2, 160); sheet.setColumnWidth(11, 150); sheet.setColumnWidth(14, 140); return sheet; } function mesclarModelo_(sheet, linha) { function tryMerge(a1) { try { sheet.getRange(a1).merge(); } catch (err) {} } tryMerge("B" + linha + ":D" + linha); tryMerge("E" + linha + ":G" + linha); tryMerge("H" + linha + ":J" + linha); tryMerge("L" + linha + ":M" + linha); tryMerge("O" + linha + ":P" + linha); } function cabecalho_(sheet) { for (var r = 1; r <= 8; r++) { var a = String(sheet.getRange(r, 1).getValue() || "").toUpperCase(); if (a.indexOf("REMETENTE") >= 0) return r; } return 2; } function norm_(s) { return String(s || "") .toUpperCase() .replace(/Ç/g, "C") .replace(/Ã/g, "A") .replace(/Á/g, "A") .replace(/Â/g, "A") .replace(/É/g, "E") .replace(/Ê/g, "E") .replace(/Í/g, "I") .replace(/Ó/g, "O") .replace(/Ô/g, "O") .replace(/Ú/g, "U"); } function colunas_(sheet, headerRow) { var lastCol = Math.max(sheet.getLastColumn(), 16); var headers = sheet.getRange(headerRow, 1, 1, lastCol).getValues()[0]; function achar(cands, padrao) { for (var i = 0; i < headers.length; i++) { var h = norm_(headers[i]); for (var j = 0; j < cands.length; j++) { if (h.indexOf(cands[j]) >= 0) return i + 1; } } return padrao; } return { remetente: achar(["REMETENTE"], 1), destinatario: achar(["DESTINATARIO"], 2), data: achar(["DATA DE RECEBIMENTO", "DATA - RECEBIMENTO", "DATA RECEBIMENTO"], 5), descricao: achar(["DESCRICAO"], 8), nf: achar(["NF"], 11), notificacao: achar(["NOTIFICAC"], 12), recebidoPor: achar(["RECEBIDO POR"], 14), retirados: achar(["RETIRADOS"], 15) }; } function ultimaLinha_(sheet, headerRow) { var last = Math.max(sheet.getLastRow(), headerRow); for (var r = last; r > headerRow; r--) { if (sheet.getRange(r, 1).getValue() || sheet.getRange(r, 2).getValue()) return r; } return headerRow; } function dataSheet_(p) { if (p.quando) { var d = new Date(p.quando); if (!isNaN(d.getTime())) return d; } return new Date(); } function escrever_(sheet, linha, cols, p, data) { var tz = tz_(); sheet.getRange(linha, cols.remetente).setValue(p.remetente || ""); sheet.getRange(linha, cols.destinatario).setValue(p.destinatario || p.nome || ""); sheet.getRange(linha, cols.data).setValue(data); sheet.getRange(linha, cols.data).setNumberFormat("dd/mm/yyyy hh:mm"); sheet.getRange(linha, cols.descricao).setValue(p.descricao || ""); sheet.getRange(linha, cols.nf).setValue(p.nf || p.codigo || ""); sheet.getRange(linha, cols.notificacao).setValue(p.notificacao || "sim"); sheet.getRange(linha, cols.recebidoPor).setValue(p.recebidoPor || ""); if (p.retirado) { var ret = new Date(p.retirado); if (!isNaN(ret.getTime())) { sheet.getRange(linha, cols.retirados).setValue(ret); sheet.getRange(linha, cols.retirados).setNumberFormat("dd/mm/yyyy"); } else { sheet.getRange(linha, cols.retirados).setValue(p.retirado); } } mesclarModelo_(sheet, linha); } function parseId_(id) { var s = String(id || ""); var m = s.match(/^([A-ZÇ]+)-(\d+)$/i); if (!m) return null; return { aba: m[1].toUpperCase(), linha: Number(m[2]) }; } function acharPorNf_(nf) { if (!nf) return null; var ss = ss_(); var atual = nomeMes_(new Date()); var ordem = [atual]; var idx = MESES.indexOf(atual); if (idx > 0) ordem.push(MESES[idx - 1]); for (var i = 0; i < ordem.length; i++) { var sheet = ss.getSheetByName(ordem[i]) || ss.getSheetByName(ordem[i].replace("Ç", "C")); if (!sheet) continue; var headerRow = cabecalho_(sheet); var cols = colunas_(sheet, headerRow); var last = ultimaLinha_(sheet, headerRow); if (last <= headerRow) continue; var vals = sheet.getRange(headerRow + 1, cols.nf, last - headerRow, 1).getValues(); for (var r = vals.length - 1; r >= 0; r--) { if (String(vals[r][0] || "").trim() === String(nf).trim()) { return { sheet: sheet, linha: headerRow + 1 + r, cols: cols }; } } } return null; } function alvo_(p) { var parsed = parseId_(p.id); if (parsed) { var sheet = ss_().getSheetByName(parsed.aba) || ss_().getSheetByName(parsed.aba.replace("Ç", "C")); if (sheet) { var headerRow = cabecalho_(sheet); return { sheet: sheet, linha: parsed.linha, cols: colunas_(sheet, headerRow) }; } } return acharPorNf_(p.nf || p.codigo); } function adicionar_(p) { var data = dataSheet_(p); var sheet = abaMes_(data); var headerRow = cabecalho_(sheet); var cols = colunas_(sheet, headerRow); var linha = ultimaLinha_(sheet, headerRow) + 1; escrever_(sheet, linha, cols, p, data); return { ok: true, id: sheet.getName() + "-" + linha }; } function atualizar_(p) { var t = alvo_(p); if (!t) return adicionar_(p); var data = dataSheet_(p); escrever_(t.sheet, t.linha, t.cols, p, data); return { ok: true, id: t.sheet.getName() + "-" + t.linha, updated: true }; } function retirar_(p) { var t = alvo_(p); if (!t) return { ok: false, error: "nao encontrado" }; t.sheet.getRange(t.linha, t.cols.retirados).setValue(new Date()); t.sheet.getRange(t.linha, t.cols.retirados).setNumberFormat("dd/mm/yyyy"); if (p.recebidoPor) { t.sheet.getRange(t.linha, t.cols.recebidoPor).setValue(p.recebidoPor); } return { ok: true, id: t.sheet.getName() + "-" + t.linha }; } function apagar_(p) { var t = alvo_(p); if (!t) return { ok: false, error: "nao encontrado" }; t.sheet.deleteRow(t.linha); return { ok: true, deleted: true }; } function fmtData_(v) { if (!v) return ""; if (Object.prototype.toString.call(v) === "[object Date]" && !isNaN(v.getTime())) { return Utilities.formatDate(v, tz_(), "dd/MM/yyyy"); } return String(v); } function fmtHora_(v) { if (Object.prototype.toString.call(v) === "[object Date]" && !isNaN(v.getTime())) { var h = Utilities.formatDate(v, tz_(), "HH:mm"); if (h === "00:00") return ""; return h; } return ""; } function listar_() { var sheet = abaMes_(new Date()); var headerRow = cabecalho_(sheet); var cols = colunas_(sheet, headerRow); var last = ultimaLinha_(sheet, headerRow); if (last <= headerRow) return []; var inicio = Math.max(headerRow + 1, last - 149); var qtd = last - inicio + 1; var maxCol = Math.max(cols.retirados, cols.recebidoPor, cols.nf); var valores = sheet.getRange(inicio, 1, qtd, maxCol).getValues(); var rows = []; for (var i = 0; i < valores.length; i++) { var r = valores[i]; var dest = String(r[cols.destinatario - 1] || "").trim(); var rem = String(r[cols.remetente - 1] || "").trim(); var nf = String(r[cols.nf - 1] || "").trim(); if (!dest && !rem && !nf) continue; var dataVal = r[cols.data - 1]; var linha = inicio + i; rows.push({ id: sheet.getName() + "-" + linha, remetente: rem, destinatario: dest, nome: dest, data: fmtData_(dataVal), hora: fmtHora_(dataVal), descricao: String(r[cols.descricao - 1] || ""), codigo: nf, nf: nf, notificacao: String(r[cols.notificacao - 1] || ""), recebidoPor: String(r[cols.recebidoPor - 1] || ""), retirado: fmtData_(r[cols.retirados - 1]), quando: Object.prototype.toString.call(dataVal) === "[object Date]" ? dataVal.toISOString() : "" }); } return rows.reverse(); } function pessoas_() { var nomes = {}; var rows = listar_(); for (var i = 0; i < rows.length; i++) { if (rows[i].destinatario) nomes[rows[i].destinatario] = true; } return Object.keys(nomes); }