Обновите / отредактируйте значения строк в листах Google из html input - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть форма html, в которую вставляются данные клиента, и она добавляет строку со значениями на лист Google.

В форме есть поле, которое ищет и возвращает данные клиентов. при поиске указанного c значения (идентификационного номера).

function getID(IDsearch){
  var ws = SpreadsheetApp.getActiveSheet();
  var data = ws.getRange(3, 1, ws.getLastRow(), 36).getValues();

  var dataInput = data.map(function(r){return r[7];});  
  var position = dataInput.indexOf(IDsearch);
  var dataArray = ws.getRange(position+3, 1, 1, 36).getValues();

  if(position > -1){
    return dataArray;
  } else {
    return position;
  }

} 

После этого все поля ввода в форме заполняются данными из этой строки. Мне нужно отредактировать значения в форме, и при отправке она должна перезаписать / обновить существующую строку с этим идентификатором.

В документации по таблицам Google я обнаружил метод spreadsheets.values.update, но я не могу понять это. Я довольно новичок в этом, и любая помощь будет оценена.

Спасибо всем!

РЕДАКТИРОВАТЬ: по мере запроса дополнительной информации см. здесь образец рассматриваемой формы и сценария.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020
  • Вы хотите добиться следующего потока.
    1. Введите «ID» в id="insertID" и нажмите «Поиск по ID».
    2. Отображение значений в электронной таблице с помощью поиска «ID».
    3. Редактирование значений id="name" и id="ID".
    4. При нажатии кнопки «Сохранить данные» необходимо обновить значения в электронной таблице.

Из ваших ответов, общих таблиц и сценариев я понял, как описано выше. Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки изменения:

  • В вашем случае processForm на стороне Сценария Google Apps необходимо изменить.
    • Поиск строки с помощью formObject и перезапись значений ячеек.

Измененный сценарий:

Когда ваш сценарий изменен, измените processForm на стороне скрипта Google Apps следующим образом. Я удаляю идентификатор таблицы из URL. Поэтому, пожалуйста, установите его перед тестированием скрипта.

function processForm(formObject) {
  var url = "https://docs.google.com/spreadsheets/d/###/edit#gid=0";
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Database");

  // I added and modified below script.
  var ranges = ws.getRange(4, 2, ws.getLastRow() - 3, 1).createTextFinder(formObject.ID).findAll();
  if (ranges.length > 0) {
    for (var i = 0; i < ranges.length; i++) {
      ranges[i].offset(0, -1, 1, 2).setValues([[formObject.name, formObject.ID]]);
    }
  } else {
    ws.appendRow([formObject.name, formObject.ID]);
  }
}
  • В этой модификации, когда существуют одинаковые идентификаторы, все строки одинаковых идентификаторов перезаписываются. Например, если вы хотите изменить первый, измените его на ranges[0].offset(0, -1, 1, 2).setValues([[formObject.name, formObject.ID]]);.

Ссылка:

0 голосов
/ 03 февраля 2020

@ dianadfonseca, как указывает @Tanaike, без более подробной информации о вашей структуре данных, люди будут спекулировать, чтобы ответить на ваш вопрос. Как я буду ...

Пожалуйста, прочитайте следующий ответ и адаптируйте его под свои нужды, если он вам подходит.

Пример:

function getRow(id){

  var ws = SpreadsheetApp.getActiveSheet();

  // Number of headers to skip
  var numHeaders = 2;

  // the starting row
  var startRow = numHeaders + 1;

  // The column where the IDs are is known
  var idCol = 8;

  // The number of rows with data not headers
  var numRows = ws.getDataRange().getLastRow() - numHeaders;

  // An array with the ids to find a match in
  // getRange() returns a 2D array, so you can transpose it to flatten it
  var ids = ws.getRange(startRow,idCol,numRows).getValues();
  ids = transpose(ids)[0];

  // Get the index where id matches in ids
  var row = ids.indexOf(id);

  // If there's a match
  if(row > -1){

    // Correct row indexing 
    row = row + startRow;
  } 

  return row;
}

function updateRow(row,data){
  var ws = SpreadsheetApp.getActiveSheet();

  // The column for each property is known
  var propertyOneCol = 1;

  // Update property using setValue()
  ws.getRange(row,propertyOneCol).setValue(data.propertyOne);

  // And so on...

}

// Transpose to avoid looping through the array
function transpose(a)
{
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

Вы можете взгляните на электронную таблицу, использованную для этого примера здесь со связанным сценарием для воспроизведения.

Вот функция, которую я использовал для тестирования

function test(){

  // You are receiving this from your form
  var data = {"propertyOne":"Juan","propertyTwo":20, "id":123467};
  var id = data.id;
  updateRow(getRow(id),data);
}
0 голосов
/ 03 февраля 2020

Попробуйте это:

function getID(IDsearch){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();//dont know what the sheet is
  var rg=sh.getRange(3,1,sh.getLastRow()-2,36);
  var data=rg.getValues();
  var idA=sh.getRange(3,8,sh.getLastRow()-2,1).getValues().map(function(r){return r[0];});//it looked like column 8 was your id column
  var idx=idA.indexOf(IDsearch);
  if(idx>-1) {
    return ws.getRange(pos + 3,1,1,36).getValues()[0];//flattened the row to a 1d array
  }else{
    return idx;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...