当前位置: 首页 > 知识库问答 >
问题:

GoogleSheets脚本-对于范围内的每个单元格,获取单元格具有特定值的行号,将行复制到范围内的第一个空白行

子车高超
2023-03-14

我来自VB背景,在实现工作表的脚本解决方案时遇到了一些困难,我想这个函数相当基本,但还不确定如何在JS中表达它。目标是循环遍历一个范围内的每个单元格(工作表1,Q3: Q1000),获取该范围内单元格具有值“TRUE”的行号,复制/剪切工作表1上符合该限定条件的每行的全部内容(或者简单地存储这些值并跳过复制/粘贴步骤),将这些值粘贴到单独工作表(Sheet2)上的第一个未使用的行,然后删除Sheet1上的原始行。

到目前为止,我已经成功地组合了这个粗糙函数,它成功地找到了给定范围内包含指定值的第一个单元格的行号,但如果该范围内出现多个值,它将返回NaN。任何关于我做错了什么的暗示都会有帮助,谢谢。

function onEditTesting(e) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
const range = "Q3:1000";
var whereTrue = "TRUE";
var range = sheet.getRange("Q3:Q1000");
var rangeValues = sheet.getRange(range).getValues();

var i = []; 
for (var y = 0; y < rangeValues.length; y++) {
   if(rangeValues[y] == whereTrue){
      i.push(y);
   }
}

var Row = Number(i)+Number(range.getRow());

}

共有2个答案

欧阳骏俊
2023-03-14

下面是使用onEdit()简单触发器的另一种方法。

function onEdit(e) {
  var ss = e.source;
  var cell = e.range;
  var sourceSheet = ss.getActiveSheet();
  var destinationSheet = ss.getSheetByName("Sheet2");

  var col = cell.getColumn();
  var row = cell.getRow();
  var lastCol = sourceSheet.getLastColumn();

  Logger.log("row: "+row+" maxCol: "+lastCol+" col: "+col+" val: "+cell.getDisplayValue()+" sheet: "+sourceSheet.getName());
  //Check if modified cell is in column Q (index 17) in Sheet1 has a value of TRUE
  if(sourceSheet.getName() == "Sheet1" && col == 17 && cell.getDisplayValue() == "TRUE"){
    //Append current row to the destination sheet
    var values = sourceSheet.getRange(row,1,1,lastCol).getValues();
    Logger.log(values);
    destinationSheet.appendRow(values.flat());
    
    //Delete current row
    sourceSheet.deleteRow(row);
  }
}
  1. 使用e.range事件对象修改源表和单元格

前(第1张):

在(第1页)之后:

之后(表2):

越景天
2023-03-14
function moveData() {
  const ss=SpreadsheetApp.getActive();
  const ssh=ss.getSheetByName('Sheet1');
  const dsh=ss.getSheetByName('Sheet2');
  const vs=ssh.getRange(3,1,ssh.getLastRow()-2,ssh.getLastColumn()).getValues();
  let oA=[];
  let d=0;
  vs.forEach((r,i)=>{
    if(r[16]=='TRUE') {
      oA.push(r);
      ssh.deleteRow(i+3-d++);
    }
  });
  dsh.getRange(dsh.getLastRow()+1,1,oA.length,oA[0].length).setValues(oa);
}
 类似资料:
  • 使用谷歌表格应用程序脚本,是否有可能得到X单元格的单元格范围如下所示: 我不想更改每个单元格的颜色,只想更改那些具有正确条件的单元格。 我知道这样做是可能的: 但是这种方法需要很长时间才能完成for循环,因为有数百个单元需要扫描。我宁愿只对整个范围使用一次getRange(而不是一次只使用一个单元格),然后从该范围使用getRange(它应该生成一个2d数组,对吗?)设置单元格值。我想那会快得多。

  • 用途:我有一个零件列表,每个工作都有变化。 我的每个part#都有3行,这就是为什么我运行“entirerow.delete”3次。 这就是我现在拥有的。

  • 在应用程序脚本中是否有一种简单的方法可以查找某个范围内的下一个空行,例如,我希望如下所示: 返回B2:D范围内的下一行空行,以便返回第4行 其他行(如A行 我正在尝试从另一个工作表(或选项卡)写入下一个空行,该工作表有一个供用户输入数据的输入区域,然后点击按钮,数据将添加到目标页上的空行(数据的第一行!B2:D)

  • 嗨,我需要移动每行(扫描)中的一个单元格范围,这些单元格包含特定列(在我的情况下可以是任何列,但在我的代码中是coln“e”)中的一个单元格,该值以文本字符串L开始。以下是我所尝试的(我是VBA新手)。在本例中,我希望将移动到,其中是行号。

  • 我需要检测对电子表格所做的更改是否在特定数据范围内进行,如果是,请设置当前更新时间 问题是,我有一个可以编辑标题和文本的电子表格,我不希望在电子表格上更新特定单元格中的更新时间,但当我编辑一系列单元格中的数据时,我确实希望更改更新时间。 以下是我必须更新的时间。 如果我编辑某些单元格(在B4: J6范围内),我只希望G10中的日期设置