Google apps script Googlesheet脚本仅在范围不为空或错误时复制范围

Google apps script Googlesheet脚本仅在范围不为空或错误时复制范围,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我试图从其他工作表(或同一工作表)复制某个范围,但仅当该范围不为空或出现类似(#N/A、#REF等)的错误消息时才复制它 例如: 表1:包含原始数据表 第2页:包含从脚本复制的数据,但此处的数据仅在原始数据不为空或无错误时才被覆盖 注意:我在这里使用QUERY进行复制,但我确信这不是最好的复制方式,因为它不会在其他工作表中保留值,而只是为了取消嵌套。如果我理解正确,如果满足以下条件,您希望将范围复制到其他工作表: 源区域不包含任何有错误的单元格 源范围中的所有空行(如果有)都位于范围的末尾

我试图从其他工作表(或同一工作表)复制某个范围,但仅当该范围不为空或出现类似(#N/A、#REF等)的错误消息时才复制它

例如:

  • 表1:包含原始数据表
  • 第2页:包含从脚本复制的数据,但此处的数据仅在原始数据不为空或无错误时才被覆盖

注意:我在这里使用QUERY进行复制,但我确信这不是最好的复制方式,因为它不会在其他工作表中保留值,而只是为了取消嵌套。

如果我理解正确,如果满足以下条件,您希望将范围复制到其他工作表:

  • 源区域不包含任何有错误的单元格
  • 源范围中的所有空行(如果有)都位于范围的末尾(空行后面没有带值的行)
如果这是正确的,您可以执行以下操作(检查内联注释):

函数copyRange(){
var ss=SpreadsheetApp.getActive();
var sourceSheet=ss.getSheetByName(“source_sheet”);//源工作表名称
var targetSheet=ss.getSheetByName(“target_sheet”);//目标工作表名称
var A1notation=“C6:E23”;//源范围的A1表示法(如有必要,请更改)
var sourceRange=sourceSheet.getRange(a1表示法);
var sourceValues=sourceRange.getValues();
var errors=[“#REF!”,“#N/A!”,“#DIV/0!”,…];//错误数组(不完整)
对于(var i=0;i{
返回rowValues.every(cellValue=>{
返回cellValue==“”;
});
}).join().indexOf(“true,false”)!=-1;
var targetRange=targetSheet.getRange(“A1”);//要复制到的范围(如有必要,请更改)
if(!emptyRowInBetween)sourceRange.copyTo(targetRange);//将范围复制到指定的目标
}
更新: 如果只想复制值,而不想复制公式等,可以执行以下操作:

sourceRange.copyTo(targetRange、SpreadsheetApp.CopyPasteType.PASTE_值);
注:
  • 你必须让它工作
参考:

脚本应逐个单元格检查范围单元格,并仅复制非空、非错误单元格,还是在发现单个空/错误单元格时不复制范围内的任何单元格?您的问题没有提供足够的信息。第一:范围是“A2:E355”=5列、354行、1770个单元格。但是你说只有当范围不为空或有错误信息时才复制它这意味着什么??:1)如果1770个单元格中的任何一个为空或有错误,则不复制任何内容?;或2)如果任何单元格为空或有错误,则不复制该单元格,或者是别的什么?第二:如果单元格为空,则不复制。。。为什么不呢它只会将空白单元格复制到空白单元格,除非Sheet2已经有内容,空白单元格将覆盖现有内容。那么,Sheet2Amblichus@Tedinoz上有什么内容?抱歉,如果不清楚的话。为了清楚起见,如果该区域有空单元格和错误消息(#ref或任何错误),则不复制,如果该区域有任何空单元格或行没有错误,则脚本仍可以复制它。这是一张纸,可能更好地解释它@Iamblichus,以防你没有看到它。因此,对空单元格的引用是不相关的;如果任何单元格出现错误,请不要复制。谢谢@Iamblichus,正如我所说,有一件事我可能没有提到,对不起,如果我重新运行脚本并且条件为真,它不会覆盖目标数据,例如,如果一个单元格E6在源代码表中从“橙色”更改为“香蕉”,如果我重新运行脚本,它不会覆盖它,空单元格也是如此,例如,如果源工作表中的单元格D10从值“10”更改为空值,我想如果我运行脚本,将值“10”覆盖到目标工作表中的空单元格,这适用于整个范围,我怎么做?@lad我不知道是什么让你这么想,但如果满足条件,此代码将覆盖以前的数据。请仔细检查一下。哦,你说得对,我现在很笨!不过有一个问题,如果我只想复制值,即不复制方程或任何其他属性,怎么做?非常感谢,@Iamblichus。我有一个听起来很愚蠢的问题,我写的一条错误消息是“加载…”以防止数据的副本仍在加载,但是,与其他错误消息不同,它会复制数据,不管为什么?这是谷歌表单中的保留文本吗?我更进一步,用REGEXEXTRACT测试了文本“加载…”,结果就像一个真正的错误消息,它变成了实际加载数据(红色箭头),即使它只是一个文本@lad我猜“加载…”不是错误,所以单元格的值不是“加载…”。我建议您(1)使用
getValue()
获取此单元格的值,(2)查看此值(以及您合理期望的值)中是否存在任何模式,以便可以检测和筛选这些值(而不是复制包含这些值的范围)。我希望我的解释有用。如果你对此有问题,我建议你为这个问题提出另一个问题。
function test() {  
  SpreadsheetApp.getActive().getSheetByName('sheet2').getRange('A2').setValue('=QUERY(sheet1!A2:E355, "SELECT A, B, C, D, E LIMIT 200",1)')
}