我想从基于php的数据库系统向谷歌应用程序引擎提交一些简单的数据。
以下代码不会产生错误,但也不会产生结果。我不知道为什么谷歌应用程序脚本没有反应。
谷歌应用程序脚本被配置为供任何知道url的人使用(允许匿名用户)。脚本将由我的帐户执行,即使它是由匿名用户触发的。应用程序脚本具有运行所需的所有权限。
目标是谷歌应用程序脚本显示发布的数据。
欢迎任何帮助。也许还有另一种方法可以将数据传输到谷歌应用程序脚本中。经过几个小时的寻找和尝试,我找不到解决办法。
在PHP系统方面,我有以下代码来发送数据:
// Get cURL resource
$curl = curl_init();
// Set some options
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://script.google.com/macros/s/AKfycbykWm97cwsxoP6NGhub8AqGuQammVwCwVgJrxjFLxY8TAFGRw/exec',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
'fname' => 'John',
'lname' => 'Miller'
)
));
// Send the request, save response to $resp
$resp = curl_exec($curl);
// Show response
echo $resp;
// Close request to clear up some resources
curl_close($curl);
echo 'curl closed';
在谷歌应用程序脚本端,我有以下代码来接收数据:
// Show name in google apps
function doPost(e) {
var parameter
var value
for (var i in e.parameters) {
parameter = i;
wert = e.parameters[i];
if (parameter == "lname") {var lname = value;}
if (parameter == "fname") {var fname = value;}
}
//Return
return HtmlService.createHtmlOutput("The name is: " + fname + " " + lname)
}
不要使用htmlService,使用contentService并返回json或纯文本。官方文件对此有更详细的解释如果仍然不确定,请确保您的php脚本能够处理重定向到googleusercontent.com的操作。首先使用doGet在浏览器url上进行尝试。您也可以在php中使用get而不是post。
在代码中使用for
循环毫无意义。即使在for
循环中,仍然需要检查参数中的值。由于出现错误,您的for
循环无法正常工作。参数末尾有一个s
。
for (var i in e.parameters) {
必须是:
e.parameter
我测试了一些代码,这个代码有效:
function doGet(e) {
Logger.log('doGet ran. e: ' + e);
Logger.log('e.parameter: ' + e.parameter);
var lname = e.parameter.lname;
var fname = e.parameter.fname;
Logger.log('e.parameter name: ' + fname);
Logger.log('e.parameter last: ' + lname);
//Return
return ContentService.createTextOutput("The name is: " + fname + " " + lname);
}
您可以在不运行PHP的情况下在浏览器中对此进行测试。但测试起来有点困难。你必须做得恰到好处。如果您将doPost()
更改为doGet()
,那么只需在浏览器中放入一个url即可对其进行测试。
您需要将搜索字符串参数添加到URL的末尾。
https://script.google.com/macros/s/YourAppsScriptID/exec?fname=Joe&lname=Wonky
运行代码的exec
版本,而不是dev
版本。但是,如果您进行了任何更改,您需要保存一个新版本,然后部署新版本,否则您将运行旧的部署版本进行测试。
使用doPost
没有任何意义。只需运行GET请求并使用doGet()
如果某个参数没有搜索值,则指定的值将为undefined
。根据你想要做的事情,你可以在应用程序脚本中检查,或者在得到回报后在PHP中检查。如果您不想要或不需要退货,那么运行内容服务是没有意义的。
如果你试图在浏览器中显示HTML内容,你应该有一个指向独立应用程序脚本的链接,甚至不要使用Curl。
您的谁有权访问应用程序的部署设置:必须是任何人,甚至匿名者,除非您希望仅在用户登录到Google帐户时运行代码。将其设置为仅匿名并不意味着它不需要用户登录。
下一个问题:应用程序的授权/访问问题脚本:以"用户访问web应用程序"的方式执行应用程序不起作用
关于"doPost"问题(见上文):将cacert.pem添加到php.ini后-发送方的cURL(php)-doPost在GAS侧
但只有当GAS中的脚本部署有以下选项时,它才有效:"将应用程序执行为:"设置为"我自己"。"谁可以访问该应用程序"设置为"任何人,甚至匿名者"。
如果我切换到"将应用程序执行为:"设置为"用户访问web应用程序"。"谁有权访问该应用程序"设置为"任何人"。
然后发生以下情况:
通过cURL向谷歌应用程序脚本发送https请求后,会出现一个用户登录谷歌的登录屏幕。chrome标签的标题是"Meet Google"。上面写着"登录以继续使用Google Drive"。整个登录屏幕都是英文的(我是德国人)。之后,我输入我的私人谷歌帐户的登录信息,并按下"登录"按钮。之后会出现第二个登录屏幕。chrome标签的标题是"谷歌硬盘"。上面写着"Zur Nutzung von Google Drive anmelden"(翻译:"请登录以访问Google Drive。")。然后我第二次输入相同的登录信息,然后按下"anmelden"按钮(翻译:"登录")。接下来发生的事情是应用程序脚本的URL显示在chrome中。该选项卡的标题为"Fehler"(翻译为"错误")。在窗口中,我可以阅读"Skript函数nicht gefunden:doGet"(翻译:"找不到脚本函数:doGet")。
我无法理解谷歌应用程序脚本的行为。尤其是我不明白谷歌为什么要"doGet",尽管应用程序脚本中肯定有"doPost"。
一些帮助将是非常受欢迎的。
@Jörg,
我也有同样的问题,但现在已经解决了。
解决方案是使用版本#2再次发布脚本,确保选择"任何人,甚至匿名",并使用"/exec"URL而不是"/dev/"