【问题标题】:Function works in debugger, but not in live code函数在调试器中有效,但在实时代码中无效
【发布时间】:2023-03-18 14:41:01
【问题描述】:

我正在使用 Google 表格来跟踪案例的详细信息。在工作表上输入信息后,我将 URL 粘贴到相关 Doc 中,以便从工作表中打开文件。

我想用工作表中的信息更新 Doc 文件的描述。我在粘贴网址时,希望它拉取相关的列信息并输入到Doc描述中。

代码如下:

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var changedCell= event.source.getActiveRange().getA1Notation();
  var column = ss.getRange(changedCell).getColumn();
  if(column == "19"){
    var cellValue =  ss.getRange(changedCell).getValue();
    var id = cellValue.replace("https://drive.google.com/a/mine.net/file/d/","")
                      .replace("https://drive.google.com/open?id=","")
                      .replace("/view?usp=sharing","")
                      .replace("&authuser=0","");
    var row = ss.getRange(changedCell).getRow();
    var desc = Utilities.formatDate(ss.getRange("B"+row).getValue(),"GMT","MM/dd/yyyy")
                   +" "+ss.getRange("C"+row).getValue()
                   +" "+ss.getRange("D"+row).getValue()
                   +" "+ss.getRange("E"+row).getValue();
    var file = DriveApp.getFileById(id);
    file.setDescription(desc);
  }
}

当我通过调试器运行它时,它可以完美运行(如果我强制输入 changedCellcolumn 信息)并且我会在相关文件中看到更新的描述。

但是,当我尝试从电子表格运行它时,我收到此错误:

[14-11-23 19:40:31:061 MST] Execution failed: You do not have permission to call getFileById (line 104, file "Code") [0.006 seconds total runtime]

如果我没有权限,为什么它会在调试中运行?而且,我如何授予权限?我对这两个文件都有完全访问权限。

在相关说明中,有没有更好的方法从 url 中提取 id?

更新 这是我设置触发器和调用函数的屏幕截图

即使将列更改为数字后,它仍然从未触发警报。

【问题讨论】:

  • 您确定在同一个项目中没有另一个名为 onEdit 的函数吗?它会阻止可安装的 onEdit 工作......
  • .gs 文件没有。有没有可能从其他地方得到一个?
  • 任何绑定到电子表格的 .gs 文件始终处于活动状态...所以答案是肯定的。
  • 有没有办法让我查看是否有任何其他 .gs 文件绑定到此工作表?

标签: google-apps-script triggers google-sheets


【解决方案1】:

正如in the documentation, simple onEdit triggers have a few restrictions 解释的那样,他们可以做什么:他们不能调用任何需要明确授权的函数。

DriveApp.getFileById()显然是需要授权的方法。

只需更改您的函数名称并创建一个可安装的 onEdit 触发器来调用该函数(脚本编辑器/菜单/资源/触发器)。

至于从 url 中检索 ID,您可以使用 split 方法来获取它:

var id = cellValue.split('/d/')[1].split('/')[0];

编辑

如cmets中所述,您的条件不正确,列是数字,而不是字符串。

为了说服自己测试以下内容并检查记录器。

function onEditInstall(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var changedCell= event.source.getActiveRange().getA1Notation();
  var column = ss.getRange(changedCell).getColumn();
  Logger.log(typeof(column)+' '+column);// is number
  if(column == 19){
    Browser.msgBox('Luck !')
  }
}

【讨论】:

  • 我永远无法让它运行。当我查看触发器时,我看到一个具有以下值的触发器:Run="onEditing"、Events="From 电子表格"、"On edit"。但是,这永远不会被调用。
  • 你检查过你的情况吗?我认为这绝不是真的,因为您使用“19”作为字符串,但它应该是一个数字......请尝试删除“”并再次检查。你确定你的新函数名也有吗?我自己进行了一个测试,它正在工作。
  • 我对“19”持肯定态度。它在调试器中工作得很好,并且可以访问 if 函数中的代码。我从列表中选择名称,所以它应该是正确的。我不确定我还缺少什么。
  • 请阅读这篇文章中的 cmets stackoverflow.com/questions/27107903/…。 ,特别是关于函数名的部分。
  • 感谢您的努力。不幸的是,我找不到任何阻止它的东西。我想我现在只能继续手动操作。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 2013-07-29
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多