Преимущества допоста для записи в Google листе

#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