Google apps script 当某个范围内的单元格发生更改时,需要运行触发器
我有一个电子表格,用户可以用注释更新“J”列中的单元格,但是当他们更新该单元格时,我需要运行脚本。 然后,这将复制“I”列和“J”列中的所有信息,并将它们粘贴到另一个单元格中,然后将Vlookup公式放回“J”中,它刚刚从中获取信息 这听起来可能是一种复杂的处理事情的方式,但因为我有各种各样的表格从不同的工作簿中提取信息,所以我需要以这种方式进行 但是,我尝试了许多解决方案,当单元格发生更改时,无法使其运行。Google apps script 当某个范围内的单元格发生更改时,需要运行触发器,google-apps-script,google-sheets,triggers,Google Apps Script,Google Sheets,Triggers,我有一个电子表格,用户可以用注释更新“J”列中的单元格,但是当他们更新该单元格时,我需要运行脚本。 然后,这将复制“I”列和“J”列中的所有信息,并将它们粘贴到另一个单元格中,然后将Vlookup公式放回“J”中,它刚刚从中获取信息 这听起来可能是一种复杂的处理事情的方式,但因为我有各种各样的表格从不同的工作簿中提取信息,所以我需要以这种方式进行 但是,我尝试了许多解决方案,当单元格发生更改时,无法使其运行。 我尝试过一个可安装的更改触发器,但它在整个工作簿上都有效,并且经常会删除它应该复制的信
我尝试过一个可安装的更改触发器,但它在整个工作簿上都有效,并且经常会删除它应该复制的信息 我已经在下面粘贴了我正在使用的代码,任何帮助都将不胜感激
函数更改(e)
{
var editRange={//J:J
排名:2,
底图:2000年,
左:10,,
右:10
};
//如果超出范围,请退出
var thisRow=e.range.getRow();
if(thisRoweditRange.bottom)返回;
var thisCol=e.range.getColumn();
如果(thisColeditRange.right)返回;
//要复制的数据存储在哪里
var ss=SpreadsheetApp.openById(“1ZQLKnCHD9acTXCKpTeOnJshHEz43FDPdKZ-U6Me-k”)
var West=ss.getSheetByName(“西部订单”)
var WestNotes=ss.getSheetByName(“WestNotes”)
//要复制的数据的范围
var CopyWestNotes=West.getRange(2,9,West.getLastRow(),2).getValues()
//在覆盖之前清除数据
var ClearNotes=WestNotes.getRange(2,1,WestNotes.getLastRow(),2).clear()
//要存储的数据的范围
var PasteWestId=WestNotes.getRange(2,1,West.getLastRow(),2).setValue(CopyWestNotes);
//输入公式以更新注释;
var公式='=IFerror(VLOOKUP(i2,\'West Notes\'!A:B,2,false),“”)
var WestFormula=West.getRange(2,10,West.getLastRow(),1).setValue(公式)
}
onEdit事件
更改触发器不是简单的触发器。你必须自己安装。这里面也没有e.range。我猜如果你检查了你的执行情况,你会看到一些错误
我将您的代码修改为onEdit()简单触发器。但是,如果您正在执行任何需要权限的操作,则可能必须使其可安装。看起来你是。所以现在您应该可以继续调试代码了
function onEdit(e) {
var editRange = {top:2,bottom:2000,left:10,right:10};
var thisRow=e.range.rowStart;
if (thisRow<editRange.top || thisRow>editRange.bottom)return;
var thisCol=e.range.columnStart;
if (thisCol<editRange.left || thisCol>editRange.right)return;
var ss = SpreadsheetApp.openById("id");
var West = ss.getSheetByName("West Orders");
var WestNotes = ss.getSheetByName("West Notes");
var CopyWestNotes = West.getRange(2, 9,West.getLastRow(),2).getValues();
var ClearNotes = WestNotes.getRange(2,1,WestNotes.getLastRow(),2).clear();
var PasteWestId = WestNotes.getRange(2,1,West.getLastRow(),2).setValues(CopyWestNotes);
var formula = '=IFerror(VLOOKUP(i2,\'West Notes\'!A:B,2,false)," ")';
var WestFormula = West.getRange(2,10,West.getLastRow(),1).setValue(formula);
}
函数onEdit(e){
var editRange={top:2,bottom:2000,left:10,right:10};
var thisRow=e.range.rowStart;
如果(thisRoweditRange.bottom)返回;
var thisCol=e.range.columnStart;
if(thisColeditRange.right)返回;
var ss=电子表格应用程序openById(“id”);
var West=ss.getSheetByName(“西部订单”);
var WestNotes=ss.getSheetByName(“West Notes”);
var CopyWestNotes=West.getRange(2,9,West.getLastRow(),2).getValues();
var ClearNotes=WestNotes.getRange(2,1,WestNotes.getLastRow(),2.clear();
var PasteWestId=WestNotes.getRange(2,1,West.getLastRow(),2).setValue(CopyWestNotes);
var公式='=IFerror(VLOOKUP(i2,\'West Notes\'!A:B,2,false),“”);
var WestFormula=West.getRange(2,10,West.getLastRow(),1).setValue(公式);
}
我应该提到,您需要在第7行中添加id。onEdit事件
更改触发器不是简单的触发器。你必须自己安装。这里面也没有e.range。我猜如果你检查了你的执行情况,你会看到一些错误
我将您的代码修改为onEdit()简单触发器。但是,如果您正在执行任何需要权限的操作,则可能必须使其可安装。看起来你是。所以现在您应该可以继续调试代码了
function onEdit(e) {
var editRange = {top:2,bottom:2000,left:10,right:10};
var thisRow=e.range.rowStart;
if (thisRow<editRange.top || thisRow>editRange.bottom)return;
var thisCol=e.range.columnStart;
if (thisCol<editRange.left || thisCol>editRange.right)return;
var ss = SpreadsheetApp.openById("id");
var West = ss.getSheetByName("West Orders");
var WestNotes = ss.getSheetByName("West Notes");
var CopyWestNotes = West.getRange(2, 9,West.getLastRow(),2).getValues();
var ClearNotes = WestNotes.getRange(2,1,WestNotes.getLastRow(),2).clear();
var PasteWestId = WestNotes.getRange(2,1,West.getLastRow(),2).setValues(CopyWestNotes);
var formula = '=IFerror(VLOOKUP(i2,\'West Notes\'!A:B,2,false)," ")';
var WestFormula = West.getRange(2,10,West.getLastRow(),1).setValue(formula);
}
函数onEdit(e){
var editRange={top:2,bottom:2000,left:10,right:10};
var thisRow=e.range.rowStart;
如果(thisRoweditRange.bottom)返回;
var thisCol=e.range.columnStart;
if(thisColeditRange.right)返回;
var ss=电子表格应用程序openById(“id”);
var West=ss.getSheetByName(“西部订单”);
var WestNotes=ss.getSheetByName(“West Notes”);
var CopyWestNotes=West.getRange(2,9,West.getLastRow(),2).getValues();
var ClearNotes=WestNotes.getRange(2,1,WestNotes.getLastRow(),2.clear();
var PasteWestId=WestNotes.getRange(2,1,West.getLastRow(),2).setValue(CopyWestNotes);
var公式='=IFerror(VLOOKUP(i2,\'West Notes\'!A:B,2,false),“”);
var WestFormula=West.getRange(2,10,West.getLastRow(),1).setValue(公式);
}
我应该提到您需要在第7行添加id。对脚本第7行的简单更改消除了问题,而不是使用.openById,我使用了.getActiveSpreadsheet对脚本第7行的简单更改消除了问题,而不是使用.openById,我使用了.getActiveSpreadsheet感谢您的回复,我已经运行了您为我编写的ammended代码,但是在编辑单元格后检查执行日志时,我仍然收到以下消息“执行失败:类型错误:无法从未定义的位置读取属性“rowStart”。(第3行,文件“code”)”您是否使用了我的代码的精确副本,包括
onEdit(e)
;是的,完全相同,但我可能应该包括我想要查看的工作表以及编辑/更改发生的范围。嗯,不知为什么,事件对象没有被填充。你要么自己调试,要么共享一个显示问题的电子表格,这样我就可以解决问题。如果您使用的是可安装的触发器,那么希望您选择的是onEdit()触发器,而不是onChange()触发器。事实上,如果这是问题所在,我将看不到它们,因为我看不到您的项目触发器。对脚本第7行的简单更改消除了问题,而不是使用.openById,我使用.getActiveSpreadsheet感谢您的回复,我已经运行了您为我编写的ammended代码,