Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 谷歌工作表-识别重复和覆盖数据_Google Apps Script - Fatal编程技术网

Google apps script 谷歌工作表-识别重复和覆盖数据

Google apps script 谷歌工作表-识别重复和覆盖数据,google-apps-script,Google Apps Script,我已经大量编辑了我发布的原始问题,因为我自己已经解决了一些问题。我现在只被一件事困住了 function payINVOICE() { var ss = SpreadsheetApp.getActive(); var ds = SpreadsheetApp.openById("14imcEob2qIZbH6AjGYtf16MJxbnfkhQn1ae4jR-Nzq4"); var srcSheet = ss.getSheetByName("INVOICE_ENTRY"); var

我已经大量编辑了我发布的原始问题,因为我自己已经解决了一些问题。我现在只被一件事困住了

function payINVOICE() {
  var ss = SpreadsheetApp.getActive();
  var ds = SpreadsheetApp.openById("14imcEob2qIZbH6AjGYtf16MJxbnfkhQn1ae4jR-Nzq4");
  var srcSheet = ss.getSheetByName("INVOICE_ENTRY");
  var dstSheet = ds.getSheetByName("INVOICE_ENTRY");

  var data_range = srcSheet.getRange('B4:J100'); 
  var data_data = data_range.getValues();
  var data_clean  = data_data.filter(function (r) {return r[1]});

  var clear_range = srcSheet.getRange('B4:I100');



  var lr = dstSheet.getLastRow(); 

  dstSheet.getRange(lr+1, 2,data_clean.length,9).setValues(data_clean);
  clear_range.clear();

}
该代码检查范围B4:J100是否存在B列中的值。 如果有一个值并且脚本运行,它会将这些行复制到dstSheet上

我的职责是将发票标记为已付款或未付款。 dstSheet将已经包含数据,通过查询将数据拉回到srcSheet中。列K不是原始查询的一部分。 如果我在srcSheet的K列中将一行标记为“PAID”,我希望代码获取data_data变量并覆盖dstSheet中已经存在的内容,以便查询随后将数据拉回到srcSheet中,J列显示为“PAID”

这意味着我可以将K列更改为“未支付”,再次运行脚本,它将重写“已支付”


这比我上一篇文章更有意义,我离实现我所需要的目标已经很近了,只是停留在这最后一点上。

如果你只是想监控上述两张工作表之间的变化,那么使用
onEdit(e)
触发器会更容易,它会告诉你哪个单元格被编辑过

一小条 解释 上面的代码使用了
onEdit(e)
可安装触发器和
e
事件对象。这样,当对
11
列(又名
K
列)上的
srcSheet
进行编辑,并且工作表名称为
“发票条目”
,则进行更改的
行将保留在
变量中。之后,相应的数据行保存在
data
变量中;
getRange(row,2,1,10)
引用对
K
列进行更改的行的范围。为了更新
数据表
,使用
设置值(数据)
数据
值设置为相应的范围

安装触发器 要在编辑操作上触发
payINVOICE(e)
功能,需要安装
OneEdit
触发器

这是通过单击此图标访问项目触发器来完成的:

之后,只需单击添加触发器按钮创建一个新触发器,并使用以下设置创建一个触发器:

尝试函数 为了尝试此行为,您只需在
K
列的
srcSheet
上进行编辑,此更改将反映在
destSheet

笔记 选择此脚本中使用的范围时考虑到以下事实:

  • K
    列由
    已支付的
    /
    未支付的
    文本组成

  • srcSheet
    dstSheet
    的数据范围相同

您可能需要根据您的工作表自定义这些,并添加您提到的所需公式/过滤器

参考
  • )


嘿,曼斯图,你的目标是什么?你介意更具体一点,提供更多关于你想要实现的目标的信息吗?例如,你想从哪张工作表中识别哪些重复项?嘿,ale13!我在原来的帖子中添加了评论。谢谢@ale13。没想到你会这么麻烦。不得不说,我发现你的解释比代码本身更有帮助,尽管我也很欣赏代码。非常感谢。嘿@mancstu,我添加了一些关于代码的解释。让我知道它是否更清楚和/或有任何问题。干杯
function payINVOICE(e) {
  var srcSheet = SpreadsheetApp.getActiveSheet(); //gets the active sheet which is supposed to be source sheet
  var dstSheet = SpreadsheetApp.openById('DEST_SHEET_ID').getSheetByName('INVOICE_ENTRY'); //gets the destination sheet 
  if (e.range.getSheet().getName() == 'INVOICE_ENTRY' && e.range.getColumn() == 11) { //e specifies where the edit has been made - therefore this if condition checks if the edit is in the INVOICE ENTRY sheet and if the column is the K column
     var row =e.range.getRow(); //this gathers the row at which the edit has been made
     var data = srcSheet.getRange(row, 2, 1, 10).getValues(); //this gathers the data corresponding to the row at which the edit has been made 
     dstSheet.getRange(row, 2, 1, 10).setValues(data); //this sets the data into the corresponding row in the destination sheet
}