【问题标题】:Google Script onEdit(e) function and row rangeGoogle Script onEdit(e) 函数和行范围
【发布时间】:2019-12-12 20:39:34
【问题描述】:

在向该社区寻求帮助并获得该社区成员 (Tedinoz) 的快速而准确的回答后,我偶然发现了两个问题。

所以解决问题,我正在尝试制作一个电子表格,如果选中了一个复选框,则行基于称为数量的列中的数字(基本上是数量-1)。

第一个问题:如何编写代码以使我的函数动态地转到电子表格中插入的所有行?当我尝试设置var row = sheet.getDataRange(); 时出现错误

第二个问题:当使用函数onEdit(e) 时,是否有一种变通方法,使该函数在选中复选框时不会添加无限行?我正在寻找在复选框为 True 时根据数量添加行或在复选框为 False 时减去行的东西(如果它们最初是为该行添加的)。

还有一种方法可以复制 C 列的文本或一系列文本(插入行时通过列)?

以下是我目前所拥有的:

function onEdit(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "Test";
  var sheet = ss.getSheetByName(sheetname);
  var row = sheet.getDataRange;

  // get value of Column H
  var colHValue = sheet.getRange(row,8).getValue()

  if (colHValue = true){
    //Logger.log("DEBUG: Col H = True. do something")

    // get value of Column D
    var Value = sheet.getRange(row,4).getValue();

    // get the quantity and convert from a string to a number
    var qty = Value;
    var qtynum = +qty;
    // var newtype = typeof qtynum; // DEBUG
    //Logger.log("DEBUG: the quantity is "+qtynum+", new type = "+newtype)

    // This inserts rows after 
    sheet.insertRowsAfter(row, qtynum-1);
  }
  else{
    //Logger.log("DEBUG: col H <> True. do nothing");
  }
}

【问题讨论】:

  • 转到所有插入的行是什么意思?

标签: google-apps-script google-sheets triggers


【解决方案1】:
function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!="Test")return;
  var colHValue=sh.getRange(e.range.rowStart,8).getValue()
  if (colHValue==true){
    sh.insertRowsAfter(e.range.rowStart, Number(sh.getRange(e.range.rowStart,4).getValue())-1);
  }
}

【讨论】:

  • 您好,感谢您对此的快速回复。上面的代码有什么我遗漏的吗?我在“var sh=e.range.getSheet();”处遇到错误无法读取属性“范围”。
  • 谢谢@Cooper!我看到代码正在运行!顺便问一下,你知道我是否可以复制一定数量的文本而不是只插入空白行吗?
  • 您可以插入行,然后将内容复制到其中。
  • 嗯,我的意思是,我可以使用类似下面的代码应用于上面的代码,但不是复制输入行,而是在插入下面的行时将 An 复制到 Dn?
【解决方案2】:

function autoDup() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var data = sheet.getDataRange().getValues();
     var newData = [];
     for(var n in data){
       newData.push(data[n]);
    if(!Number(data[n][3])){continue};// if column 3 is not a number then do nothing
      for(var c=1 ; c < Number(data[n][3]) ; c++){ // start from 1 instead of 0 because we have already 1 copy
      newData.push(data[n]);//store values
    }
  }
  sheet.getRange(1,1,newData.length,newData[0].length).setValues(newData).sort({column: 1, ascending: false});// write new data to sheet, overwriting old data
}

【讨论】:

  • Stack Snipped 应该只用于可执行代码(单击“Run code sn-p”应该执行代码)。另一方面,请添加关于如何回答问题的简要说明。
  • 嘿@Rubén,上面的代码是我以下问题的一个示例,评论说“嗯,我的意思是,我可以使用类似下面的代码应用于上面的代码,而不是复制输入行只是复制插入下面的行时的到 Dn?"
  • Answer 只能用于回答问题。如果您有后续问题,您应该发布一个新问题。
  • 您好,请关注How do I write a good answer?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多