【问题标题】:Cannot activate a sheet from a standalone script (Google Apps script)无法从独立脚本(Google Apps 脚本)激活工作表
【发布时间】:2019-09-22 17:29:28
【问题描述】:

为了保护代码(让人们看不到它),我从一个独立的脚本管理我的电子表格。

除了激活工作表或单元格之外,所有函数都可以工作(这些函数与绑定脚本一起工作,计算正确,单元格被激活)。

我尝试从独立脚本激活工作表,然后将其添加为库并从我的文件的绑定脚本中调用。没有任何作用。

我需要在电子表格打开时激活工作表和单元格。

这是我的代码(绑定到电子表格):

function onOpen() {      
    RandomNetwork.goToLastBlock()
}

这是来自库(独立脚本)的代码:

//goes to the last block on the sheet
function goToLastBlock() {  

    var file = SpreadsheetApp.openById("1kTOcxVv7RgIvp-BVvbZyBbeE92HiAKm8hbFURh19Enc")

    var sheets = file.getSheets()

    for (var i in sheets) {

        var sheetID = sheets[i].getSheetId()

        if (sheetID === 908402362) {

            var lr = sheets[i].getLastRow()
            var cell = sheets[i].getRange(lr, 1)

            sheets[i].activate()
            sheets[i].setCurrentCell(cell)

            return
        }
    }
  }

当我从绑定脚本运行它时,它会找到此电子表格和工作表,并正确计算最后一行。但是当我从脚本运行时,它什么也没做。

如何从独立脚本激活工作表和单元格?如有任何建议,我将不胜感激。

【问题讨论】:

  • Ppl 可以很容易地从绑定脚本中获取你的库代码:Logger.log(RandomNetwork.goToLastBlock)
  • 堆栈片段应仅用于可执行的 HTML/CSS/JavaScript 代码。在极少数情况下,它可以用于 Google Apps Script 客户端代码,但“从不”用于服务器端代码(您应该为您的服务器端代码创建一个 api,这对于大多数 Google Apps 脚本来说太令人费解了问题。
  • @TheMaster 哇。安全解决方案是什么?
  • 抱歉@Ruben 没有明白你所说的)
  • @kiki 您的安全问题到底是什么?您需要阻止人们看到代码还是需要阻止他们修改代码?如果您不希望人们看到代码,是否有特殊原因?大多数“秘密”可以使用properties service 隐藏。

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


【解决方案1】:

您无法从独立脚本激活工作表和单元格。

只有容器绑定脚本才能激活工作表和范围。 container-bound description 中没有明确提及您使用的特定方法,但事实就是如此。

图书馆有更细致入微的范围,您可以阅读更多关于here的信息。如表中所示(在链接中),库可以访问容器。本质上,因为您的容器绑定脚本使用该库,所以如果您愿意的话,独立脚本会被复制到容器绑定脚本中,因此可以访问这些特权方法。

【讨论】:

  • 感谢您的参考。我看到我无法从独立脚本中设置活动范围。也来自图书馆?有什么解决方法吗?大家知道吗?
  • @kiki 您可以从库中,但前提是您从容器绑定脚本中执行库代码。
  • 这就是我在示例中所做的 - 从绑定脚本运行库函数: function onOpen() { randomNetwork.goToLastBlock() } randomNetwork 是库。还是你的意思是别的?
  • @kiki 您在原始帖子中写道,“当我从库中运行它时,它会找到这个电子表格和工作表,正确计算最后一行。”我理解这意味着它正在工作,所以我不确定你在做什么不工作。
  • 我犯了一个错误。它适用于装订纸。但不是来自带有此代码的库。你能帮忙吗?
【解决方案2】:

每次更改库中的代码时,都需要发布新版本,并且还必须更改库绑定脚本中的版本号。

作为测试,我将以下代码放在一个独立的脚本中:

//goes to the last block on the sheet
function goToLastBlock() {  

    var file = SpreadsheetApp.getActive();

    var sheets = file.getSheets()
    var theSheet = sheets[0];

    var lr = theSheet.getLastRow()
    var cell = theSheet.getRange(lr, 1)

    theSheet.activate()
    theSheet.setCurrentCell(cell)

    return theSheet.getSheetName();
}

然后,从绑定到工作表的脚本中,我将库(独立)添加到绑定脚本并从绑定脚本运行代码:

function onOpen() {      
    RandomNetwork.goToLastBlock()
}

代码激活了最后一行的 A 列单元格。

我将库发布为 Web 应用程序,以“用户访问 Web 应用程序”和“组织内的任何人”身份执行

使用提供的示例代码并按照描述进行设置对我有用。

【讨论】:

  • 不要忘记库开发者模式:)
  • 伙计们,我最初处于开发者模式。然后我创建了一个新版本的库,也作为 Web 应用程序发布,但仍然无法让库正常工作。连接库时出现问题。 webapp 还需要 doGet() 函数,我觉得我在这里不需要 web 应用程序。你怎么看?
  • 现在两个脚本项目的开发者模式都开启了,版本 2 都适用,我可以选择库并且所有功能都被建议但未执行。
  • 只有在向已发布的 URL 发出 HTTPS GET 请求时,才需要 doGet() 简单的触发函数。 doGet() 通常用于将 HTML 呈现给浏览器,但它也可以用于在不向浏览器显示 HTML 的情况下获取响应。关键是,您不需要doGet() 函数即可将脚本发布为Web 应用程序。如果你想要版本控制,那么你需要一种方法来创建不同的版本。如果不发布,您将无法做到这一点。
  • 这令人困惑。 doGet() 不需要,也不需要发布。您只需要创建一个version 并授予用户对库代码的查看权限。如果您希望最终用户也使用开发模式,那么最终用户需要是granted write access。无论哪种方式,就您当前的测试目的而言,这些似乎都不是问题。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多