当行与子字符串匹配时,如何将行移动一位?

时间:2018-10-01 14:43:44

标签: google-apps-script google-sheets

有人可以帮我解决这个问题吗?

附上我正在尝试做的示例工作表:

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到列row(vals [r] [c])= row(vals [r] [c + 1])

Realit(EDIT)y:

超出了内存限制错误...可能发生无限循环...我想这可能是因为我要添加数据范围中不存在的列,但是我该如何解决这个问题?

解决了!!!

经过多次尝试和错误后,我得到了答案(张贴在他的回答中)

很高兴第一次解决自己的问题!

1 个答案:

答案 0 :(得分:1)

我的问题正是我所期望的。我正在尝试分配超出范围的值。

我解决这个问题的方法是将我的所有值分配给一个数组(我也在过程中将它们移了过来),然后遍历范围(范围只是一个二维数组),分配了所有将值转移到范围列。

cp