Javascript 一旦出现';s指定列上的更新
我有两张电子表格,分别是和。在Source中,我列出了我的样品产品及其指定价格,并使用导入功能将其复制到目的地。现在,我试图在“目的地工作表1”B:B仅有更新时触发OnChange触发器。这是我的密码:Javascript 一旦出现';s指定列上的更新,javascript,google-apps-script,google-sheets,triggers,Javascript,Google Apps Script,Google Sheets,Triggers,我有两张电子表格,分别是和。在Source中,我列出了我的样品产品及其指定价格,并使用导入功能将其复制到目的地。现在,我试图在“目的地工作表1”B:B仅有更新时触发OnChange触发器。这是我的密码: function testFunction(e) { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination Sheet 1"); if (e.source.getSheet
function testFunction(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination Sheet 1");
if (e.source.getSheetName = "Destination Sheet 1" && e.range.getRow() > 1 && e.range.getColumn() == 2){
var range = ss.getRange(e.range.getRow(), 3, ss.getLastRow());
range.setValue("There's an update");
}
}
function onEdit(e){
aSourceFunction(e);
}
function aSourceFunction(e) {
//IF stmt to make sure that OnEdit Trigger is not triggerred anywhere
if (e.source.getSheetName = "Source Sheet 1" && e.range.getRow() > 1 && e.range.getColumn() == 2){
//my attempt to call Destination Sheet 1 from Destination
var ss = SpreadsheetApp
.openByID("1QMtU6VbNQyDLXMHmaLBBDePH5l")
.setActiveSheet("Destination Sheet 1");
//desired outcome
ss.getRange(e.range.getRow(), 4, ss.getLastRow()).setValue("There's an update");
}
}
我还添加了这个函数
但是,基于事件,我没有选项获取从事件对象更新的范围。所谓“范围”,我指的是目的地表1'B:B。我得到这个错误:
“TypeError:无法在testFunction(代码:3:64)读取未定义的属性'getRow'”
期望的结果(更新“目的地表1”中的定价后!B:B):
我对谷歌脚本还是相当陌生的,我真的尝试了我能想到的一切,但这并没有让我有任何进展。非常感谢您的帮助。提前谢谢你
更新1:
当在IMPORTRANGE函数上的工作表上有更新时,似乎无法触发OnChange触发器
备选方案:
因为它不起作用,所以我想在源代码上使用OnEdit触发器来处理编辑,并在目标代码上应用我想要的结果。但是,我有权限问题
例外:您没有调用SpreadsheetApp.openById的权限。所需权限:
这是我的密码:
function testFunction(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination Sheet 1");
if (e.source.getSheetName = "Destination Sheet 1" && e.range.getRow() > 1 && e.range.getColumn() == 2){
var range = ss.getRange(e.range.getRow(), 3, ss.getLastRow());
range.setValue("There's an update");
}
}
function onEdit(e){
aSourceFunction(e);
}
function aSourceFunction(e) {
//IF stmt to make sure that OnEdit Trigger is not triggerred anywhere
if (e.source.getSheetName = "Source Sheet 1" && e.range.getRow() > 1 && e.range.getColumn() == 2){
//my attempt to call Destination Sheet 1 from Destination
var ss = SpreadsheetApp
.openByID("1QMtU6VbNQyDLXMHmaLBBDePH5l")
.setActiveSheet("Destination Sheet 1");
//desired outcome
ss.getRange(e.range.getRow(), 4, ss.getLastRow()).setValue("There's an update");
}
}
另外,我不确定我的担忧是否与此相关,但我在某个地方读到,我的代码不应该只有@OnlyCurrentDoc
,但即使在清单文件中,我的代码中也没有
{
"timeZone": "Asia/Hong_Kong",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
以下是它的范围:
更新2:成功了!最初,我有一个简单的OnEdit触发器。但是,根据,您需要有一个可安装的OnEdit触发器才能工作(还修复了我的错误代码),当我运行代码时,会出现“权限提示”以访问目标电子表格。以下是我为需要它的人编写的代码:
function aSourceFunction(e) {
//IF stmt to make sure that OnEdit Trigger is not triggerred anywhere
if (e.source.getSheetName = "Source Sheet 1" && e.range.getRow() > 1 && e.range.getColumn() == 2){
//my attempt to call Destination Sheet 1 from Destination
var ss = SpreadsheetApp.openById("1QMtU6VbNQyDLXMHmaLBBDePH5l-4wDPUNQ827gb3jXY");
var sheet = ss.getSheetByName("Destination Sheet 1");
//desired outcome
sheet.getRange(e.range.getRow(), 4).setValue("There's an update");
}
}
注意:转到编辑>当前项目的触发器>添加触发器,使用aSourceFunction作为函数,OneEdit作为触发器。来自问题
但是,基于事件,我没有选项获取从事件对象更新的范围。所谓“范围”,我指的是目的地1'B:B
您是对的,无法从change event对象获取udpdated的范围
但如果您已经知道感兴趣的范围是“目的地表1”!B:B
您可以使用:
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var range = spreadsheet.getRange("Destination Sheet 1!B:B");
关于错误消息,由于更改事件对象不包含范围
属性,因此会出现此错误消息
请记住(从)
当用户修改电子表格本身的结构(例如,通过添加新工作表或删除列)时,将运行可安装的更改触发器
关于如何使OnChange触发器仅在B列上的更新时触发,您可以尝试使用getActiveRange()
,但有时它不起作用。这方面还有一个悬而未决的问题
相关的
getActiveRange()
,但有时它不起作用。已经检查了与此@Rubén相关的未决问题。“不适用于importrange。@感谢校长感谢你们两位抽出时间回答我的问题。如果这不起作用,我正在考虑的另一种方法是在源代码中使用OnEdit触发器处理手动编辑。但是,由于权限问题,我似乎不能这样做。我会更新我的帖子,你可以查看。再次感谢。:)