Я хочу отправить несколько простых данных из системы баз данных на основе php в движок приложений Google.
Следующий код не выдает ошибки, но и результата тоже нет. Я не могу выяснить, почему скрипт приложений Google не реагирует.
Сценарий Google Apps настроен для использования любым, кто знает URL (разрешен анонимный пользователь). Скрипт будет выполнен моей учетной записью, даже если он запущен анонимным пользователем. Скрипт приложений обладает всеми правами, необходимыми для работы.
Цель состоит в том, чтобы скрипт приложений Google отображал опубликованные данные.
Любая помощь будет очень кстати. Может быть, есть другой способ передачи данных в скрипт приложений Google.
Я не мог найти решение после нескольких часов поиска и попытки.
На стороне 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';
На стороне скрипта приложений Google у меня есть следующий код для получения данных:
// Show name in google appsfunction 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. попробуйте сначала на URL браузера, используя doGet. Вы также можете использовать get вместо post в своем php.
Там нет смысла иметь 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. Установка просто анонимное не означает, что пользователь не должен входить в систему.
Следующая проблема: Проблема авторизации / доступа к сценарию приложения: Запустите приложение, так как «Пользователь, доступ к веб-приложению» не работает.
По вопросу «doPost» (см. Выше):
После добавления cacert.pem в php.ini он отлично работает с
— cURL на стороне отправителя (php)
— doPost на стороне ГАЗА
НО это работает, только если сценарий в GAS развернут со следующими параметрами:
«Выполнить приложение как:» имеет значение «Сам».
«У кого есть доступ к приложению» установлено значение «Любой, даже анонимный».
Если я переключусь на
«Запустить приложение как:» имеет значение «Пользователь, получающий доступ к веб-приложению».
«У кого есть доступ к приложению» установлено значение «Любой».
тогда происходит следующее:
После отправки https-запроса через cURL в скрипт приложения Google, появляется экран входа для входа пользователя в Google. Вкладка в Chrome называется «Познакомьтесь с Google». Там написано «Войдите, чтобы продолжить на Google Диске». Весь экран входа в систему на английском языке (я немец).
После этого я ввожу данные для входа в личную учетную запись Google и нажимаю кнопку «Войти».
После этого появится второй экран входа. Вкладка в Chrome называется «Диск Google». Там написано «Zur Nutzung von Google Drive anmelden» (перевод: «Пожалуйста, войдите, чтобы получить доступ к Google Drive.»). Затем я ввожу ту же информацию для входа во второй раз и нажимаю кнопку «anmelden» (перевод: «войти»).
Следующее, что происходит, заключается в том, что URL-адрес скрипта приложения отображается в Chrome. Вкладка называется «Fehler» (перевод: «Ошибка»). В окне я могу прочитать «Skript-Funktion nicht gefunden: doGet» (перевод: «Функция сценария не найдена: doGet»).
Я не могу понять поведение скрипта приложений Google. Особенно я не могу понять, почему Google запрашивает «doGet», хотя определенно есть «doPost» в скрипте приложений.
Некоторая помощь будет приветствоваться.
@ Йорг,
У меня была такая же проблема, но теперь она исправлена.
Решение состоит в том, чтобы снова опубликовать ваш скрипт с версией №2, убедитесь, что вы выбрали «Anyone, даже anonymous» и используете URL «/ exec» вместо «/ dev».