首页 > 解决方案 > Google 表格脚本:结合 onEdit 和 openById("OtherSheetsId")

问题描述

我在这方面很糟糕,但在发帖之前我确实搜索了很多。我找到了一些答案,现在我被困在这部分。

简而言之:我们有 2 个单独的谷歌文档表。当电子表格 1 中的特定单元格发生更改时,脚本必须更改电子表格 2 中特定单元格的值。

function onEdit(e) {
var mainsheet = SpreadsheetApp.getActive().getSheetByName('Main');
var changeit  = sheet.getRange("A1").getValue();
var offsheet = SpreadsheetApp.openById("spreadsheet2s id").getSheetByName('Echo').getRange("A1");

if (changeit == 'true'){

offsheet.setValue('true');
}

它基本上不起作用,并且在脚本中,当我转到 Run -> Executions Transcript 时,它告诉我执行失败:您无权调用 SpreadsheetApp.openById。

当我在同一张纸上尝试这个时,它工作正常。

似乎可安装的触发器可以解决问题,但我无法找到任何关于这里究竟要做什么的信息,例如如何应用可安装的触发器。

谷歌信息说,这将允许函数更改另一张纸上的信息。我们如何使它仅适用于上面列出的 onEdit(e) 函数?

最大的问题是,我们如何使这项工作/将它们联系在一起?我所做的只是将其粘贴在下面(好像它是它自己的功能)。我以各种方式使用它(例如尝试在其中添加 openByID 信息以及其他一些愚蠢的事情),我想我在这里遗漏了一些简单的东西。

function createSpreadsheetEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onEdit')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

预先感谢您的帮助。

标签: google-apps-scriptgoogle-sheets

解决方案


尝试这个:

function ss1OnEdit(e){
  if(e.range.getSheet().getName()!='Main') return;
  SpreadsheetApp.openById("ss2id").getSheetByName("Echo").getRange(e.range.getA1Notation()).setValue(e.value);
}
//You can run this function all you want it will not create more than one trigger.  But you must run it once to setup the first trigger.
function createSS1OnEditTrigger() {
  var ss=SpreadsheetApp.getActive();
  var trgs=ScriptApp.getProjectTriggers();
  var found=false;
  for(var i=0;i<trgs.length;i++) {
    if(trgs[i].getHandlerFunction()=="ss1OnEdit") {
      return;
    }
  }
  if(!found) {
    ScriptApp.newTrigger("ss1OnEdit").forSpreadsheet(ss.getId()).onEdit().create();
  }
}

推荐阅读