Google Sheet Script: найти номер строки ячейки в другом диапазоне листа по уникальному значению последней строки, затем обновить столбцы целевой строки - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть два листа, один - это форма ответов, другой - с уникальными рабочими кодами. При отправке формы я хотел бы скопировать и вставить метку времени последнего рабочего кода в лист «timedata» в столбце D, где рабочий код совпадает. Я также хотел бы сделать то же самое для СТАТУСА; скопируйте статус из ответа и вставьте его на лист «timedata» в столбце E, где рабочий код совпадает. Вот мой файл: https://docs.google.com/spreadsheets/d/1h2_tdStLOGSEtBToXKeb6FGCcVRhokyr7KRIv4uRgm4/edit?usp=sharing

У меня есть следующий сценарий, но я не знаю, как его продолжить;

function lastName() {
  var wb = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = wb.getSheets()[0];
  var ui = SpreadsheetApp.getUi();

  var lr = ss1.getLastRow();
  var lc = ss1.getLastColumn();
  var dl = ss1.getRange(lr, lc);
  var cl = ss1.getRange(lr, lc - 1);
  var bl = ss1.getRange(lr, lc - 2);
  var al = ss1.getRange(lr, lc - 3);
  var ss2 = wb.getSheetByName('timedata');

  var mfns = ss2.getRange("A:A").getValues();
  var i = 1;
  mfns.forEach(function(eachmfns) {
    if (cl.getValue() == mfns) {
    var dataRange = ss2.getRange(2, 1, 20, 5);
    var ss2 = wb.getSheetByName('timedata');
    dataRange = ss2.getRange(2 + i, 1 + 3);
    dataRange.setValue(al);
    i++; //to get the next row
}});
}

Я буду признателен, если кто-нибудь поможет мне до этот этап. Если мне удастся дойти до этой точки, я думаю, что смогу рассчитать время начала и время отклика работы, поэтому обновите ВСЕ время работы.

Заранее спасибо.

Редактировать РЕШЕНИЕ : ссылка на мой файл работает, форма недоступна, но скрипт работает, когда вы ее запускаете. Пожалуйста, скопируйте его в свой gDrive и попробуйте!

Ответы [ 2 ]

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

Исходя из того, что я понял о вашей проблеме, я полагаю, что вы в основном пытаетесь поместить данные последнего элемента листа 1 в соответствующий элемент рабочего кода на листе 2. Если это не то, что вы хотели, или я неправильно понял Ваш вопрос, пожалуйста, дайте мне знать, и я обновлю этот ответ соответственно.

Однако, если я прав, это решение вашей проблемы (подробности объяснены в комментариях к этому коду):

Решение

function makeItWork(){
  
  var wb = SpreadsheetApp.getActiveSpreadsheet();
  var ss2 = wb.getSheetByName('timedata'); 
  var ss1 = wb.getSheets()[0];
  var lr = ss1.getLastRow();
  var lc = ss1.getLastColumn();
  
  // Get the desired values of the last added item including its workcode
  var timestamp = ss1.getRange(lr,1).getValue();
  var status = ss1.getRange(lr,4).getValue();
  var workcode = ss1.getRange(lr, 3).getValue();
  
  // Get the column values of workcode to then see which one matches with the last added item
  var columnValues = ss2.getRange('A:A').getValues(); 
  
  // Get values returns an Array with the elements nested in their own arrays,
  // we need to flat them to be able to do the array search later
  var searchValues = columnValues.flat();
  
  // Returns the row number of the adecuate workcode if it can match it to the one of the last element
  var searchResult = searchValues.indexOf(String(workcode)); 

  if(searchResult != -1){
  // If it found a match, add the data of the last element of sheet 1 in the right cells acording to the workcode match
  ss2.getRange(searchResult, 4).setValue(timestamp);
  ss2.getRange(searchResult, 5).setValue(status);
  }

}

Надеюсь, это помогло вам, пожалуйста, дайте мне знать, если вам нужно что-то еще или вы чего-то не поняли.

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

Обязательное чтение:

Примечания:

  • getValues() возвращает двумерный массив, проиндексированный по строкам и столбцам (Array [0] [1] = первая строка, второй столбец)
  • Исключение вызовов getValue*() внутри al oop может значительно повысить производительность.
  • Использование пакетных операций

Пример сценария:

function lastName() {
  var wb = SpreadsheetApp.getActiveSpreadsheet();
  var ss1 = wb.getSheets()[0];
  var ui = SpreadsheetApp.getUi();

  var lr = ss1.getLastRow();
  var lc = ss1.getLastColumn();
  const [al, bl, cl, dl] = ss1.getRange(lr, 1, 1, lc).getValues();
  var ss2 = wb.getSheetByName('timedata');

  var mfnsRng = ss2.getDataRange();
  const mfns = mfnsRng.getValues();//[[A1,B1..],[A2,B2..],[A3,B3..]...]
  mfns.forEach(function(row) {//row=currentRow=[A1,B1,C1..]
    if (cl === row[0]) {//row[0] = A1
      row[3] = al;//row[3] =Col D
      row[4] = dl;
    }
  });
  mfnsRng.setValues(mfns);//set modified values back
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...