【问题标题】:Spreadsheet isn't opened by openById()电子表格未由 openById() 打开
【发布时间】:2020-04-13 17:51:31
【问题描述】:

也许你可以帮助我解决我试图解决几个小时的问题。我有一个函数应该将一行单元格的一些值复制到另一个电子表格中,如果在该行的第 6 列中将值设置为 6。我已经使用 ui.alert() 来知道函数在哪里停止工作,并且是在我用 ss = SpreadsheetApp.openById('123456789') 覆盖变量 ss = SpreadsheetApp.getActiveSpreadsheet() 时。我已经在另一个谷歌脚本中做了这个,它在那里工作! 在这里你可以看到我的代码:

var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();

function onOpen() {
  ui.createMenu('xyz')
      .addItem('xyz', 'menuItem1')     
      .addToUi();
}

function menuItem1() {
var row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();
var col = 2;
var x = SpreadsheetApp.getActiveSheet().getRange(row, col).getValue();
var y = Browser.inputBox(titletranslation , 'Please enter the translation here', Browser.Buttons.OK_CANCEL);
  if(y != "cancel" && y != "") {
var id ="123456789"
doc = DriveApp.getFileById(id).makeCopy(y)
doc.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.EDIT)
var url = doc.getUrl()
SpreadsheetApp.getActiveSheet().getRange(row, 5).setValue(url)
  }
}

function onEdit(event){
var row = event.range.getRow()
var column = event.range.getColumn()
if(column == 6) {
  if(ss.getActiveSheet().getRange(row, column).getValue() == 6) {
    var x = ss.getActiveSheet().getRange(row, 1)
    var y = ss.getActiveSheet().getRange(row, 2)
    var z = ss.getActiveSheet().getRange(row, 3)
    var xx = ss.getName()
    var yy = ss.getActiveSheet().getRange(row,4)

    ss = SpreadsheetApp.openById('123456')

    ss.setActiveSheet(ss.getSheetByName('Need to be published'))

    ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,1).setValue(x)
    ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,2).setValue(y)
    ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,3).setValue(z)
    ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,4).setValue(xx)
    ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,5).setValue(yy)



  }

}

}

希望您知道问题所在:) 提前致谢

【问题讨论】:

  • 您不能使用未绑定容器的脚本进行任何*active* 调用。阅读this。另外阅读minimal reproducible example,具体来说,描述问题。 “它不起作用”的描述性不足以帮助人们理解您的问题。相反,告诉其他读者预期的行为应该是什么。告诉其他读者错误消息的确切措辞是什么,以及产生它的代码行。使用简短但描述性的问题摘要作为问题的标题
  • 据我了解,容器绑定脚本是在 Google 电子表格、文档等的脚本编辑器中编码的,对吧? - 这就是我所做的......我还告诉了脚本应该做什么 - 重要的函数是 onEdit(event) 函数,它应该将另一个电子表格中的单元格值设置为当前电子表格的某些单元格的值。我还告诉了哪一行产生了错误 - onEdit(event) 函数 ss = SpreadsheetApp.openById() 的第 11 行。我不知道我应该在哪里收到错误消息,所以我不添加它们。也许你可以说在哪里。
  • 在视图>Stackdriver 错误报告中找到错误消息。是的。那是一个容器绑定脚本。但容器是它所绑定的电子表格。不是您通过Id(例如ss2)打开的新电子表格。该脚本未绑定到 ss2。因此,您不能在 ss2 上调用 active 调用。ss.getsheetbyname() 返回 sheet。无需激活即可直接调用.getRange()sheet上的其他调用。

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


【解决方案1】:

问题是组合

var x = ss.getActiveSheet().getRange(row, 1)

ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,1).setValue(x)

让我们将其转换为:

var range1 = ss.getActiveSheet().getRange(row, 1);
var range2 = ss.getActiveSheet().getRange(ss.getActiveSheet().getLastRow() + 1,1);
range2.setValue(range1);

range1(或x)不是一个值,因此将其用作setValue()方法的参数是错误的,请参阅documentation

如果您想要将range1 分配给range2,正确的语法应该是

var value = range1.getValue();
range2.setValue(value);

您应该相应地更改使用方法setValue() 的所有行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多