javascript 可以读取从应用脚本函数返回的字符串吗?

Posted

技术标签:

【中文标题】javascript 可以读取从应用脚本函数返回的字符串吗?【英文标题】:can javascript read strings returned from app script functions? 【发布时间】:2016-12-22 04:31:44 【问题描述】:

在 Google-Apps-Script 中,我创建了一个函数,该函数返回包含电子表格文件 id 的字符串(此 id 因用户而异,因为它是从模板复制的新文件)。

function findSheet() 
//Opens User's Google Drive and searches files for a spreadsheet called "blahblah" and returns the active spreadsheet
var files = DriveApp.getFilesByName("blahblah");
var file = files.next();
var newID = file.getId();
Logger.log(newID);
return newID;

Logger.log(newID) 在我的测试中显示文件的 id 名称。但是,当我尝试为返回的 id 字符串启动一个 javascript 变量时,它变得未定义。

<script>
var idname;
idname = google.script.run.findSheet();
alert(idname);

我有另一个 google scripts 应用程序函数(从 javascript 调用),它使用该 id 字符串变量作为参数,以便将用户输入从我的 html 页面写入他们的 google 电子表格,作为 web 应用程序的一部分,但是 id来自 javascript 的名称未定义,并且该功能不起作用。

有什么我不知道为什么应用脚本字符串在被 javascript 调用时未定义的原因吗?

我尝试使用 idname.toString() 来修复,但当我使用 alert(idname) 或 document.write(idname) 或重写段落时,它仍然显示为未定义

<p idname="showmeID"></p>
<script>
document.showmeID.innerHTML.idname

【问题讨论】:

除了下面的好答案之外,请记住变量不会在执行实例之间或跨执行实例之间保持其值。这些类型的 ID 非常适合存储在用户属性 (IMO) 中。此处和 GAS 文档中有很多问答:如果需要,该怎么做。 【参考方案1】:

google.script.run 是一种异步客户端 JavaScript API,可用于 HTML 服务页面,可以调用服务器端应用程序脚本函数。

根据documentation,此API 是异步的,不直接返回值。相反,它在回调函数中返回值。

google.script.run
    .withFailureHandler(function(err)
        // callback function that will be executed when some error will occur.
        // Error object is passed as the first argument.
        console.log("failure handler", err)
    )
    .withSuccessHandler(function(res)
        // here withSuccessHandler runs when your findSheet function runs successfully.
        // value returned from google app script will be passed as the first argument of this callback function.
        // So you will receive the value returned from GAS in variable `res`.
        console.log("response from findSheet function", res)
    )
    .findSheet();

【讨论】:

如果我将函数定义为:变量 idNameOfFile = google.script.run.withFailureHandler(function(err)).withSuccessHandler(function(res ) return res; ).findSheet(); 如果你会看到developers.google.com/apps-script/guides/html/reference/run 的文档,它会说: void — 此方法是异步的,不会直接返回;但是,服务器端函数可以将一个值作为传递给成功处理程序的参数返回给客户端;此外,返回类型也受到与参数类型相同的限制,只是表单元素不是合法的返回类型 你应该熟悉javascript异步api和promise...promises可以用来解决“回调地狱”的问题。异步 js:blog.risingstack.com/asynchronous-javascript 回调地狱:callbackhell.com 承诺:developer.mozilla.org/en/docs/Web/JavaScript/Reference/… 你可以在互联网上找到更好的资源......这些是我通过谷歌搜索快速找到的 无论您将从 google app 脚本函数返回什么(字符串/对象/数组)(在您的情况下是从 findSheet 函数),您都将在 .withSuccessHandler(function(res) // res 中获得该值是你的价值 ) 。这里 function(res) 异步运行,即在 findSheet() 执行完成之后,您不能直接返回它。您可以将其传递给其他函数以进行进一步处理。或者你可以使用 javascript 承诺

以上是关于javascript 可以读取从应用脚本函数返回的字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

从使用 wkwebview 返回值的 javascript 调用 swift 函数

特殊字符u2028导致的Javascript脚本异常

如何使用blueprism中的invoke js从javascript函数返回输出

使用 evaluateJavaScript(..) 调用 javascript 函数,以读取应用程序包中的文本文件

从运行在 Web 浏览器控件中的 JavaScript 脚本调用 C++ 函数

如何让 Siri 读取 Pythonista 脚本的返回值?