【问题标题】:Auto insert row above, based on single cell value基于单个单元格值在上方自动插入行
【发布时间】:2019-06-19 08:09:53
【问题描述】:

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

我无法确定需要放入脚本编辑器的变量。

我尝试在谷歌上搜索帮助并修改其他人的脚本,看看我是否能做到,答案是否定的,不,我不具备知识/技能。

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 包含以下任何一项;是,否,已加载,已卸载

如果它包含任何这些值,它将自动在上方插入一行。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我有点不清楚你的意图以及你遇到了什么问题。

    我看到的一些事情:

    1) 由于您的范围是单个单元格,var numCols = range.getNumColumns(); 应该始终返回 1,因此您的循环 for (i = 1; i &lt;= 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);
        }
      }
    }
    

    【讨论】:

    • 对不起,我是新手,感谢达斯汀的帮助。让我澄清一下。我只想在第二行上方插入一个空行,(我不希望在其他任何地方插入任何其他行)如果单元格 A2 满足某个条件/值,则该值为 YES、NO、LOADED、UNLO​​ADED,这将是可选的从下拉列表中。这个想法是,当有人将单元格 A2 中的状态更改为 4 个值(是、否、已加载、未加载)中的任何一个时,我希望它在上面插入一行,以便我们可以在闲暇时在该行中输入新内容。
    • 我用另一种解决方案编辑了我的答案,以解决我认为您所描述的问题。
    • 嗨达斯汀,再次感谢您的回复和编辑。我还在网上遇到问题; code var 已编辑范围 = e.range;因为它给了我一个错误; TypeError:无法从未定义中读取属性“范围”。 (第 10 行,文件“代码”)
    • 如果您手动调用该函数,ee.range 都将是未定义的。如果您将函数命名为 onEdit(e),则每当对附加的电子表格进行编辑时,它都会自动调用。
    • 达斯汀,请忽略我最后的评论。奇怪的是,我在脚本编辑器中遇到错误,但是,当我运行该函数时,即使出现错误,它也可以在 GoogleSheets 中运行……抱歉,我说我仍然有问题。您的功能完美无缺,它只是在实际脚本编辑器中给了我一个错误,因此我认为它不起作用......我很抱歉,也非常感谢您帮助我在某些条件下自动在 A2 上方插入一行是遇到了。
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2021-03-22
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多