{"files":[{"id":"d1a497bf-e188-4224-9329-2088b2e7de69","name":"Código","type":"server_js","source":"var SPREADSHEET_ID \u003d \u002714QBx6dLarbFHEcZ1PL5cxTlM6lrKd1u2j45nPwQ5ztQ\u0027;\nvar db \u003d PropertiesService.getScriptProperties();\n\nfunction setup(){\n  db.setProperties({\n    \u0027SPREADSHEET_ID\u0027: \u002714QBx6dLarbFHEcZ1PL5cxTlM6lrKd1u2j45nPwQ5ztQ\u0027\n  });\n}\n\nfunction reply(data){\n  return ContentService\n    .createTextOutput(JSON.stringify(data))\n    .setMimeType(ContentService.MimeType.JSON);\n}\n\nfunction handleError(message){\n  return reply({ result: \u0027error\u0027, error: message });\n}\n\nfunction handleSuccess(data) {\n  return reply({ result: \u0027success\u0027, data: data });\n}\n\nfunction locked (fn, parameters){\n  var lock \u003d LockService.getPublicLock();\n  lock.waitLock(30000);\n  \n  try {\n    return fn(parameters);\n  } catch(e) {\n    return handleError(e);\n  } finally {\n    lock.releaseLock();\n  }\n}\n\n\n// get\nfunction list(par) {\n  var doc \u003d SpreadsheetApp.openById(db.getProperty(\u0027SPREADSHEET_ID\u0027));\n  var sheet \u003d doc.getSheetByName(par.sheet);\n  \n  if(!sheet){\n    return handleError(\u0027sheet \u0027+par.sheet+\u0027 not found\u0027)\n  }\n  \n  var headRow \u003d parseInt(par.hrow) || 1\n  var raw \u003d sheet.getRange(headRow, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues().filter(function(r) { return r.join(\u0027\u0027).length });\n  var keys \u003d raw[0];\n  \n  var data \u003d [];\n  raw.forEach(function(row, rowId){\n    if(rowId \u003e headRow-1 \u0026\u0026 row.indexOf(\u0027undefined\u0027) \u003d\u003d -1){\n      var line \u003d {};\n      row.forEach(function (col, colId) {\n        line[keys[colId]] \u003d col;\n      });\n      data.push(line);\n    }\n  })\n  \n  return handleSuccess(data);\n}\n\n//add\nfunction add(par) {\n  var doc \u003d SpreadsheetApp.openById(db.getProperty(\u0027SPREADSHEET_ID\u0027))\n  var sheet \u003d doc.getSheetByName(par.sheet)\n  \n  var headRow \u003d parseInt(par.hrow) || 1\n  var headers \u003d sheet.getRange(headRow, 1, 1, sheet.getLastColumn()).getValues()[0];\n  \n  var nextRow \u003d sheet.getLastRow()+1; // get next row\n  var row \u003d [];\n  \n  // loop through the header columns\n  headers.forEach(function(i) {\n    if(i \u003d\u003d\u003d \"id\"){\n      var idComplement \u003d (par.name || par[\u0027label\u0027])\n      row.push(par[\"\"+i] || (nextRow + (idComplement ? \" - \"+idComplement : \"\" )));\n    } else {\n      row.push(par[\"\"+i] || \"\");\n    }\n  })\n  \n  // more efficient to set values as [][] array than individually\n  sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);\n  \n  var line \u003d {};\n  row.forEach(function (col, colId) {\n    line[headers[colId]] \u003d col;\n  });\n\n  return handleSuccess({ id: nextRow, row: line, headers: headers })\n}\n\nfunction doGet(e){\n  if(!e || !e.queryString.length || !e.parameter.op) {\n    return handleError(\u0027no parameters passed\u0027);\n  }\n  \n  switch(e.parameter.op){\n    case \u0027list\u0027:\n      if(!e.parameter.sheet) {\n        return handleError(\u0027no sheet passed\u0027);\n      }\n      return list(e.parameter);\n    case \u0027add\u0027:\n      if(!e.parameter.sheet) {\n        return handleError(\u0027sheet not passed\u0027);\n      }\n      return locked(add, e.parameter);\n    default:\n      return handleError(\u0027not found\u0027);\n  }\n}\n \nfunction doPost(e){\n  if(!e || !e.queryString.length || !e.parameter.op) {\n    return handleError(\u0027no parameters passed\u0027);\n  }\n  \n  switch(e.parameter.op){\n    case \u0027add\u0027:\n      if(!e.parameter.sheet) {\n        return handleError(\u0027sheet not passed\u0027);\n      }\n      return locked(add, e.parameter);\n    default:\n      return handleError(\u0027not found\u0027);\n  }\n}\n\n\n\n//\n//\n//function handleResponse(e) {\n//  var lock \u003d LockService.getPublicLock();\n//  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.\n//   \n//  try {\n//    // next set where we write the data - you could write to multiple/alternate destinations\n//    var doc \u003d SpreadsheetApp.openById(SPREADSHEET_ID);\n//    var sheet \u003d doc.getSheetByName(SHEET_NAME);\n//     \n//    // we\u0027ll assume header is in row 1 but you can override with header_row in GET/POST data\n//    var headRow \u003d e.parameter.header_row || 1;\n//    var headers \u003d sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];\n//    var nextRow \u003d sheet.getLastRow()+1; // get next row\n//    var row \u003d []; \n//    // loop through the header columns\n//    for (i in headers){\n//      if (headers[i] \u003d\u003d \"Timestamp\"){ // special case if you include a \u0027Timestamp\u0027 column\n//        row.push(new Date());\n//      } else { // else use header name to get data\n//        row.push(e.parameter[headers[i]]);\n//      }\n//    }\n//    // more efficient to set values as [][] array than individually\n//    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);\n//    // return json success results\n//    return ContentService\n//          .createTextOutput(JSON.stringify({\"result\":\"success\", \"row\": nextRow}))\n//          .setMimeType(ContentService.MimeType.JSON);\n//  } catch(e){\n//    // if error return this\n//    return ContentService\n//          .createTextOutput(JSON.stringify({\"result\":\"error\", \"error\": e}))\n//          .setMimeType(ContentService.MimeType.JSON);\n//  } finally { //release lock\n//    lock.releaseLock();\n//  }\n//}"},{"id":"349e082f-a131-4ebb-89ba-186c0564d19f","name":"appsscript","type":"json","source":"{\n  \"timeZone\": \"America/Sao_Paulo\",\n  \"dependencies\": {\n  },\n  \"webapp\": {\n    \"access\": \"ANYONE_ANONYMOUS\",\n    \"executeAs\": \"USER_DEPLOYING\"\n  },\n  \"exceptionLogging\": \"STACKDRIVER\",\n  \"executionApi\": {\n    \"access\": \"ANYONE\"\n  }\n}"}]}