根据单个单元格的值自动在上方插入行

时间:2019-06-18 18:45:37

标签: google-apps-script google-sheets

我正在尝试根据单元格的值在当前顶部行(第2行)上方自动插入一行。

spreadsheet picture

我无法弄清楚需要输入到脚本编辑器中的变量。

我尝试使用Google搜索来寻求帮助,并修改了其他人的脚本以查看是否可以这样做,但答案是否定的,不,我没有知识/技能。

function conditionalNewRow() {
  var ss = SpreadsheetApp.getActive().getSheetByName('NEW INV');
  var sh = ss.getActiveSheet();
  var headerRow = 1;
  var firstRow = headerRow + 1;
  var range = sh.getRange("A2"); // Get range of row 2.
  var futureRange = sh.getRange("A3"); // Get range of row 3.
  var numCols = range.getNumColumns(); // Get the number of columns for row 2.
  var contentVal = false;

  for (i = 1; i <= numCols; i++) {
    var currentValue = range.getCell(1,i).getValue();
    if (currentValue == "NO"){
      contentVal = true;
      break;
    }
  }  
  if (contentVal == true) {
    sh.insertRowBefore(firstRow); // Insert an empty row into row 2.       
    futureRange.copyTo(sh.getRange(firstRow, 1, firstRow, numCols), {contentsOnly:false}); // Copy row 3 to row 2.
  }
}

当单元格满足特定条件时,我想要的只是前一行上方的空白行;

例如单元格A2包含以下任何内容;是,否,已加载,已卸载

如果其中包含任何一个值,它将自动在上面插入一行。

1 个答案:

答案 0 :(得分:1)

我不清楚您的意图和所遇到的问题。

我看到的几件事:

1)由于范围是单个单元格,var numCols = range.getNumColumns();应该始终返回1,因此循环for (i = 1; i <= numCols; i++)应该只运行一次。感觉这里有很多冗余代码。

要获取单元格A2的值,您可以编写:

var range = sh.getRange("A2");
var currentValue = range.getValue();

2)从if语句来看,如果A2的值不是“ NO”,则似乎只想添加新行。那是对的吗? (这不是您的问题所指出的)。如果是这样,我认为您与sh.insertRowBefore(firstRow);语句非常接近,它可能会在一些复杂的逻辑中迷失方向。

3)您是否真的要将第3行中的所有内容复制到第2行中?在问题中,您需要声明“当一个单元格满足特定条件时,我所需要的只是上一行的空白行”。

也许这样的东西更接近您想要的?

function conditionalNewRow() {
  var ss = SpreadsheetApp.getActive().getSheetByName("NEW INV");
  var sh = ss.getActiveSheet();

  var range = sh.getRange("A2"); // Get range of row 2.
  var currentValue = range.getValue();

  if (currentValue !== "NO") {
    sh.insertRowBefore(firstRow); // Insert an empty row into row 2.
  }
}

编辑

在您的注释中,听起来好像您想在将A2编辑为可选值之一时插入新行。您可能想检出simple triggers,例如onEdit,该事件在编辑单元格时将运行。例如,如下所示:

/**
 * The event handler triggered when editing the spreadsheet.
 * @param {Event} e The onEdit event.
 */
function onEdit(e) {
  // get sheet
  var sheet = SpreadsheetApp.getActive().getSheetByName("NEW INV");

  // Get the edited range
  var editedRange = e.range;

  // check if cell A2 was edited
  if (editedRange.getA1Notation() === "A2") {
    // check if value is a desired value
    if (editedRange.getValue() === "YES" || "NO" || "LOADED" || "UNLOADED") {
      // if yes to both, insert new row
      sheet.insertRowBefore(2);
    }
  }
}