Javascript 一旦出现';s指定列上的更新

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

我有两张电子表格,分别是和。在Source中,我列出了我的样品产品及其指定价格,并使用导入功能将其复制到目的地。现在,我试图在“目的地工作表1”B:B仅有更新时触发OnChange触发器。这是我的密码:

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()
,但有时它不起作用。这方面还有一个悬而未决的问题

相关的


B:B在源表中如何更改?@TheMaster我正在手动更改值。我在考虑使用OnEdit,因为当您手动操作时,它会自动触发,但我需要触发器处于OnChange上。为什么您需要它处于OnChange上?不要使用答案/变通方法编辑您的问题。改为在下面添加一个答案。当在IMPORTRANGE函数上的工作表上有更新时,似乎无法触发OnChange触发器。错。你可以触发它,但它不会告诉你改变了哪个范围谢谢你的回答!真的很感激!但是有一个问题,如何使OnChange触发器仅在B列上的更新时触发?您可以尝试使用
getActiveRange()
,但有时它不起作用。已经检查了与此@Rubén相关的未决问题。“不适用于importrange。@感谢校长感谢你们两位抽出时间回答我的问题。如果这不起作用,我正在考虑的另一种方法是在源代码中使用OnEdit触发器处理手动编辑。但是,由于权限问题,我似乎不能这样做。我会更新我的帖子,你可以查看。再次感谢。:)