使用php/ccurl将数据发布到谷歌应用程序脚本


Posting data to google apps script using php/curl

我想从基于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/"