Скрипт Google Несколько критериев в одной строке и проверка значения в предыдущей строке - PullRequest
0 голосов
/ 01 июня 2018

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

function yourFunction(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg=sh.getDataRange();//columns are fruit,status and then cost.
var vA=rg.getValues();
for(var i=1;i<vA.length;i++){
 if(vA[i][0].toString()=='Apple' && vA[i][1].toString()=='Ripe' && vA[i][2].toString=='Large' && vA[i][4].toString=''){
  vA[i][4]=5.5;
  }
 }
  rg.setValues(vA);//This writes all of the data at one time.
}

Я хотел бы добавить к этому второй набор критериев, который рассматривает другое значение столбца = номер лота (столбец D).Предполагая, что текущий номер лота совпадает с номером предыдущей строки, и где все вышеперечисленные совпадают, каждая дополнительная строка будет заданным значением 3. Но если значение номера лота перед текущей строкой не совпадает, то значение5. В том, что я прочитал, в этом может быть условие зацикливания, чтобы вычисления не продолжались и продолжались.Любая помощь здесь будет высоко ценится.Спасибо!

Вот ссылка на базовый формат электронной таблицы Тестовый скрипт

1 Ответ

0 голосов
/ 02 июня 2018

Вот обновленная функция, которая демонстрирует общий подход к тому, что, я полагаю, вы описываете.

var COLUMNS = {
  FRUIT: 0,
  STATUS: 1,
  SIZE: 2,
  LOT_NUMBERr: 3,
  COST: 4,
  NEW_VALUE: 5,
}

function updateValues() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet3');
  var range = sheet.getDataRange();
  var values = range.getValues();
  var previousLotNumber = -1;
  for(var i = 1; i < values.length; i++){

    if (values[i][COLUMNS.FRUIT] == 'Apple'
        && values[i][COLUMNS.STATUS] == 'Ripe') {
      values[i][COLUMNS.COST] = 5.5; 
    }

    if (previousLotNumber == values[i][COLUMNS.LOT_NUMBER]) {
      values[i][COLUMNS.NEW_VALUE] = 3;
    } else {
      values[i][COLUMNS.NEW_VALUE] = 5;
    }
    previousLotNumber = values[i][COLUMNS.LOT_NUMBER];
  }
  range.setValues(values);
}

После запуска этой функции этот лист выглядит следующим образом:

+--------+-----------+--------+------------+------+-----------+
| Fruit  |  Status   |  Size  | Lot Number | Cost | New Value |
+--------+-----------+--------+------------+------+-----------+
| Apple  | Ripe      | Large  |        101 |  5.5 |         5 |
| Apple  | Ripe      | Medium |        101 |  5.5 |         3 |
| Apple  | Ripe      | Large  |        103 |  5.5 |         5 |
| Apple  | Not Ready | Large  |        102 |      |         5 |
| Apple  | Not Ready | Medium |        101 |      |         5 |
| Banana | Ripe      | Large  |        201 |      |         5 |
| Orange | Ripe      | Large  |        301 |      |         5 |
| Orange | Not Ready | Medium |        301 |      |         3 |
| Pear   | Ripe      | Large  |        401 |      |         5 |
+--------+-----------+--------+------------+------+-----------+

Несколько замечаний:

  • используйте описательные имена переменных
  • используйте набор констант для предоставления описательных имен для столбцов
  • для вашего запроса, все, что вам нужносделать это использовать переменную для хранения номера партии предыдущих строк, не требуется дополнительная сложность цикла
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...