Как я могу сдвинуть строки на одну, когда они соответствуют подстроке? - PullRequest
0 голосов
/ 01 октября 2018

Может кто-нибудь помочь мне решить эту проблему?

Прилагается пример листа того, что я пытаюсь сделать:

https://docs.google.com/spreadsheets/d/12w4rGArGi1I1wlpm5yJJtT5AAlMM4LcZC31_DpP6jZQ/edit?usp=sharing

Я пытаюсь сдвинутьсястроки, которые содержат «PO» в моем выборе данных.(см. функцию сдвига)

Это должно измениться с этого:

example1

на это:

enter image description here

Я написал скрипт, но он не работает, и я не получаю сообщение об ошибке.

У меня такое ощущение, что я пытаюсь "+1 "мой массив, чтобы компенсировать мои значения.Пожалуйста, помогите!

Вот мой текущий сценарий:

function shift() {
  try{
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var as = ss.getActiveSheet();
    var ar = as.getActiveRange();
    var vals = ar.getValues();                              // get values from the active (selected) range...... intended use is to draw a selection where the PO BOX substring is in the leftmost column
    //  SpreadsheetApp.getUi().alert(vals);                 //for checking values
    var r;                                                  // variable for rows

    for (r = 0; r < vals.length; r++){                      // for each row, up to the last row (iterate over all rows from top to bottom)
      if(vals[r][0].indexOf("PO") != -1){                   // if first column in each row contains "PO"
        SpreadsheetApp.getUi().alert("found a PO BOX");     // make annoucement
        var c;                                              // variable for columns
        var cols = [];                                      // array for column data (for debugging)
        for (c = 0; c < vals[r].length; c++){               // for each columns in row (iterating over each cell in row from left to right)
          cols[c] = vals[r][c];                             // add the current cell value to an array 
          vals[r][c+1] = vals[r][c];                        // take the value from the current cell and assign it to the next cell (+1 to the column)
        }
        SpreadsheetApp.getUi().alert(cols);                 // show me the data that cas changed

      }
    }
    ar.setValues(vals);                                     // set new values to active range
  }
  catch(err){
    SpreadsheetApp.getUi().alert(err);
  }
}

Ожидания:

  1. получить диапазон данных (мой предполагаемый диапазон тестирования B:От 1 до D: 12)

  2. итерация по каждой строке и по каждой строке итерация по каждой ячейке (столбцу)

  3. Если самопервая ячейка в текущей строке (vals [r] [0]) содержит подстроку «PO», затем я хочу изменить значения этой строки таким образом, чтобы они все смещались на один столбец, и оставить самую первую ячейку какпустая строка

  4. Я изменяю значения, заменяя текущие значения теми же значениями, НО +1 к строке столбцов (vals [r] [c]) = строка (vals [r][c + 1])

Realit (EDIT) y:

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

решено !!!!

После долгих проб и ошибок, я могу сответ (опубликовано в его ответах)

чувствую себя прекрасно, впервые решив свою проблему!

1 Ответ

0 голосов
/ 01 октября 2018

моя проблема была именно то, что я ожидал.Я пытался присвоить значения за пределами диапазона.

Способ, которым я решил это, состоял в том, чтобы присвоить все мои значения массиву (я также переместил их в процессе), а затем перебрать диапазон (диапазон - это просто двумерный массив),присвоение всех смещенных значений столбцам диапазона.

function shift() {
  try{
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var as = ss.getActiveSheet();                     
    var ar = as.getActiveRange();
    var vals = ar.getValues();
    var r; //variable for rows

    for (r = 0; r < vals.length; r++){                                           // for each row, up to the last row (iterate over all rows from top to bottom)
      if((vals[r][0].indexOf("PO") != -1)||(vals[r][0].indexOf("P0") != -1)){    // if first column in each row contains "PO"
        var c; // variable for columns                                                    
        var cols = []; // array to store all data temporarily (will be uses to set new values later)
        for (c = 0; c < vals[r].length; c++){                                   // then iterate over each column(cell) in the row
          if(c == 0){                                                           // if it is the first row,
            cols[c+1] = vals[r][c];                                             // assign second index of the array with the PO value (to simulate a shift)
            cols[c] = "";                                                       // assign the first index of the array a blank string
          }
          else{                                                                 // if it is not the first row
            cols[c+1] = vals[r][c];                                             // assign each additional column value to the next index (+1) of the array
          }
        }
        for (c = 0; c < vals[r].length; c++){                                   // once the array is finished, loop through the columns again foreach row
          vals[r][c] = cols[c];                                                 // this time, assigning the new values to the corresponding array indices
        }
      }
    }
    ar.setValues(vals);                                                         // now, set the values that you reassinged to the array
  }
  catch(err){
    SpreadsheetApp.getUi().alert(err);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...