#google-apps-script #google-sheets
Вопрос:
Я сделал лист Google с веб-интерфейсом для чтения (и записи) данных, это всего лишь пример данных https://docs.google.com/spreadsheets/d/1mHvsQGLpeY73qSNnh4FwgDffbLhb1PFMkmrLU34SKi8/edit?usp=sharing
Я использовал функцию doGet. Для меня это работает нормально, но мой вопрос в том, подходит ли doGet для опций чтения и записи или есть какая-либо причина или преимущество использования doPost вместо этого. И если есть преимущества, какими были бы изменения, то используйте доПост
Вот код:
function doGet(e) {
var txt = '';
var cod = e.parameter.cod;
var rea = e.parameter.rea;
var wri = e.parameter.wri || '';
if (cod) {
if (wri) {
if (!rea) txt = writeFunction(cod,wri);
else txt = 'bad params';
} else txt = readFunction(cod,rea);
} else txt = 'no cod';
return ContentService.createTextOutput(txt);
};
function readFunction(code,read) {
var txt = '';
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var readAll = 0;
var toRead = [];
if (read) {
if (read.slice(0,1) == '[') {
toRead = JSON.parse(read);
if (toRead.indexOf('Code') < 0) toRead.push('Code'); // always return code field
} else readAll = -1;
} else readAll = 1;
if (readAll >= 0) {
var range = ss.getRangeByName('data');
var data = range.getValues();
var fields = data[0]; // field names
var colCode = fields.indexOf('Code');
if (colCode >= 0) {
var obj= {};
for (var i=1; i<data.length; i ) {
if (!data[i][colCode]) break;
if (data[i][colCode] == code) {
for (var j=0; j<fields.length; j ) {
if (readAll || toRead.indexOf(fields[j])>=0) obj[fields[j]] = data[i][j];
}
break;
}
}
if (obj.Code) txt = JSON.stringify(obj);
else txt = 'code not found';
} else txt = 'bad data';
} else txt = 'bad param';
} catch(e) {txt = e.message;}
return txt;
};
function writeFunction(code,write) {
var txt = '';
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (write.slice(0,1) == '{') {
var toWrite = JSON.parse(write);
var range = ss.getRangeByName('data');
var data = range.getValues();
var fields = data[0];
var colCode = fields.indexOf('Code');
if (colCode >= 0) {
for (var i=1; i<data.length; i ) {
if (data[i][colCode] == code) {
var data_i = data[i];
for (field in toWrite) {
if (field != 'Code') { // not change code
var pos = fields.indexOf(field);
if (pos>=0) data_i[pos] = toWrite[field];
}
}
range.offset(i,0,1).setValues([data_i]);
txt = 'ok';
break;
}
}
if (!txt) txt = 'not found';
} else txt = 'bad data';
} else txt = 'bad param';
return txt;
};
/// ========================== test in another script
const urlApp = 'https://script.google.com/macros/s/AKfycbzID0LYXEWNrEbsF6Q2KNbmAbXa0zLdhjc5dcMPRjTqw_oHmjE/exec';
function testRead() {
var cod = 'code 3';
var fields = ["field2","field3"]; // empty to get all fields
var url = urlApp '?cod=' cod;
if (fields.length > 0) url = 'amp;rea=' encodeURIComponent(JSON.stringify(fields));
var resp = UrlFetchApp.fetch(url);
var txt = resp.getContentText();
Logger.log(txt)
}
function testWrite() {
var cod = 'code2';
var write = {'field2':12,'field1':'any'};
var url = urlApp '?cod=' cod;
url = 'amp;wri=' encodeURIComponent(JSON.stringify(write));
var resp = UrlFetchApp.fetch(url);
var txt = resp.getContentText();
Logger.log(txt)
}
```
Комментарии:
1. Нет никакого преимущества или недостатка в использовании doPost() по сравнению с doGet(). Это вопрос предпочтений. См.: developers.google.com/apps-script/guides/web