【问题标题】:Published google script link with Google Sheet returning printing empty variable已发布带有 Google Sheet 的 Google 脚本链接返回打印空变量
【发布时间】:2020-02-20 17:34:00
【问题描述】:

由于我倾向于漫无边际,首先是简短版本,如果您需要更多信息,请阅读长版本。

TL;DR

为什么会这样:


function doGet(e) {

var sheet = SpreadsheetApp.getActiveSheet();

var jobsCreated = sheet.getRange(12,2).getValue();

Browser.msgBox(jobsCreated);

var params = JSON.stringify({number:jobsCreated});

return ContentService.createTextOutput(params);

}

当我作为网站发布然后打开时返回: {"number":""}

什么时候应该看起来更像这样{"number":2451}

完整版:

首先,我在大学学习编程以攻读计算机科学学位(10 年前),但从那以后我没有做过太多编程,所以我基本上是个新手。

现在回答问题。我有一个非常简单的脚本,它是使用 Google 表格中的脚本编辑器创建的


function doGet(e) {

var sheet = SpreadsheetApp.getActiveSheet();

var jobsCreated = sheet.getRange(12,2).getValue();

Browser.msgBox(jobsCreated);

var params = JSON.stringify({number:jobsCreated});

return ContentService.createTextOutput(params);

}

首先我得到我正在处理的工作表

然后我从该表中选择一个单元格

现在,如果我使用 msgBox 来确保我有正确的号码并运行脚本,它就会工作并显示消息。

接下来,我将变量格式化为 JSON,最后只创建一个文本输出。

现在我部署为 Web 应用程序

  • 以我的身份执行
  • 任何人,甚至是匿名的

当我访问该网站时,我只能看到这个: {"number":""} 如果我更改代码并提供 jobsCreated 和静态值,它可以正常工作

var jobsCreated = 100;
{"number":100}

所以我的结论是,与直接从编辑器运行脚本相比,从发布的链接运行脚本时访问单元格的值存在问题,但我不知道如何解决这个问题。

更多信息,我正在尝试将其用于名为 Smiirl 的计数器,我从这里获得了大部分信息 https://medium.com/@m_nebra/bootstrapping-your-company-counter-22f5d4bc7dd4

【问题讨论】:

  • 修改后是否重新发布了新版本的脚本?
  • 2.删除 Browser.msgbox 并尝试
  • 我已经重新发布了新版本,我现在是第 16 版,包含我尝试过的所有更改,关于 Browser.msgbox,我也尝试过没有它。我只是把它放在那里检查我是否得到了一些东西,但后来我没有测试它
  • 试试console.log(jobsCreated)。并在 stackdriver 中查看日志。您应该保存一个新版本(创建一个新版本 v17)然后发布。或者,只需尝试/dev url
  • @ITVHR 看看我的回答是否适合你。

标签: json function google-apps-script web-applications


【解决方案1】:

试试这个:

function doGet(e) {
  return ContentService.createTextOutput(Utilities.formatString('number: %s',SpreadsheetApp.getActiveSheet().getRange(12,2).getValue());

}

【讨论】:

  • 感谢您的回复,但没有成功。它缺少一个括号,但我修复了它,但我得到的结果是数字:
【解决方案2】:

好的,正如我回复@Aerials 一样,再次感谢您的帮助。看到其他不应该与我的脚本一起工作的代码,我决定创建一个新的工作表和脚本作为测试,并使用完全相同的代码。

但是现在再检查一下,我认为这不是问题,因为它可以毫无问题地获取号码。由 GoogleAnalytics 加载项填充的单元格。现在,当再次设置插件以获取信息时,来自网站的脚本再次返回一个空值。因此,似乎问题在于脚本在由插件填充时从工作表(仅已发布的版本)中获取信息

【讨论】:

    【解决方案3】:

    您的问题在于JSON.stringify的使用

    在 JSON 中,函数不允许作为对象值。

    JSON.stringify() 函数将忽略 JavaScript 对象中的任何函数或将其更改为 null

    也就是说,您可以执行以下操作:

    function doGet(e){
      
      // Get the value of the range
      var sheet = SpreadsheetApp.getActiveSheet();
      var jobsCreated = sheet.getRange(12,2).getValue();
      
      // JSON Stringify it
      var params = JSON.stringify({"number" : number=jobsCreated});
      
      // Return JSON string
      return ContentService.createTextOutput(params);
      
    }
    

    返回:

    • {"number":123} 如果jobsCreated 是数字 123,或者
    • {"number":"Mangos"} 如果jobsCreated 是字符串“Mangos”。

    查看部署的脚本here,以及要使用的sheet


    注意:

    你应该避免在 JSON 中使用函数,函数会失去作用域,你必须使用 eval() 将它们转换回函数。


    【讨论】:

    • 首先感谢您的回复。我试过了,它返回的结果与原始版本相同。如果我使用相同的 Browser.msgBox 打印参数,它会显示正确的参数字符串,它只是在我运行不起作用的已发布脚本时显示。
    • 部署的脚本没有问题
    • 还要澄清我最后尝试获取 JSON 的原因是因为我试图将其与设备绑定,来自 Smiirl 的自定义计数器只接受 JSON 形式的值
    • 这就是我如此沮丧的原因,因为我认为我也不应该遇到任何问题,而且当静态数字仅在使用已发布的脚本和它的单元格中的值时它才能正常工作不工作
    • @ITVHR 我留下了web app的链接,你可以看看,还有sheet + script
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多