Как передать параметры из одного Google-Apps-скрипта в другой и выполнить?
- цель состоит в том, чтобы передать данные из Google Apps Script A в Google Apps Script Б.
- скрипт a публикуется с разрешениями execute as user.
- скрипт B публикуется с разрешениями execute as me (владелец).
по крайней мере, я хочу иметь возможность пройти Session.getActiveUser.getEmail()
из сценария A в сценарий B.
это то, что у меня есть до сих пор...
Скрипт A
// Script-as-app template.
function doGet() {
var app = UiApp.createApplication();
var button = app.createButton('Click Me');
app.add(button);
var handler = app.createServerHandler('myClickHandler');
button.addClickHandler(handler);
return app;
}
function myClickHandler(e) {
var url = "https://script.google.com/macros/s/AKfycbzSD3eh_SDnbA4a7VCkctHoMGK8d94SAPV2IURR3pK7_MwLXIb4/exec";
var payload = {
name : "Gene",
activeUser : Session.getActiveUser().getEmail(),
time : new Date()
};
var params = {
method : "post",
payload : payload
}
Logger.log("Hello World!");
var HTTPResponse;
try{
HTTPResponse = UrlFetchApp.fetch(url, params);
}catch(e){
Logger.log(e);
}
return HTTPResponse;
}
сценарий Б
function doPost(e){
if(typeof e === 'undefined')
return;
var app = UiApp.createApplication();
var panel = app.add(app.createVerticalPanel());
for(var i in e.parameter){
panel.add(app.createLabel(i + ' : ' + e.parameter[i]));
Logger.log(i + ' : ' + e.parameter[i]);
}
ScriptProperties.setProperty('Donkey', 'Kong');
return app;
}
выход
переход к сценарию здесь страница загрузится кнопку. Нажатие кнопки вызывает " Hello World!"для входа в журнал проекта сценария A, но журнал проекта сценария B остается пустым. TryCatch не регистрирует никаких ошибок.
1 ответов
Я считаю, что ваша проблема связана с тем, что вы пытаетесь передать в качестве аргумента ответа элемент uiapp.
вот небольшая вариация вашего скрипта в сервисе html.
the демо
сценарий:
// #### Part A
function doGet(e) {
var html ="<input type='text' id='text' /><input type='button' onclick='myClick()' value='submit'>"; // a text to be passed to script B
html+="<div id='output'></div>"; // a place to display script B answer
html+="<script>";
html+="function myClick(){google.script.run.withSuccessHandler(showResults).myClickHandler(document.getElementById('text').value);}"; // handler to do the job in script A
html+="function showResults(result){document.getElementById('output').innerHTML = result;}</script>"; // function to show the result of the urlfetch (response of script B)
return HtmlService.createHtmlOutput(html);
}
function myClickHandler(text) {
var url = ScriptApp.getService().getUrl();
var payload = {
name : "Gene",
text : text,
time : new Date()
};
var params = {
method : "post",
payload : payload
}
Logger.log("text: "+text);
var HTTPResponse;
try{
HTTPResponse = UrlFetchApp.fetch(url, params);
}catch(e){
Logger.log(e);
}
return HTTPResponse.getContentText();
}
// ###### Part B
function doPost(e){
if(typeof e === 'undefined'){
return "e was empty!!";
}
var htmlOut="<ul>";
for(var i in e.parameter){
htmlOut+="<li>"+i+ " : " + e.parameter[i]+"</li>";
if(i=="text"){
htmlOut+="<li> Text hash : "+Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, e.parameter[i]))+"</li>";
}
}
htmlOut+="</ul>";
return ContentService.createTextOutput(htmlOut);
}
важно отметить, что у вас не будет возможности получить события регистратора сценария B (потому что он запускается, когда вас нет-вы не тот, кто запускает сценарий B. Это сценарий A, который запускает сценарий B и сценарий A не идентифицируется как "вы", когда он делает urlfetch). Если вы хотите получить результат script B logger, вы должны вернуть его в скрипт a. Важно отметить: опять же, когда сценарий A делает UrlFetch для сценария B, он не идентифицируется как "вы", поэтому сценарий B должен быть открыт кем-либо (в опции публикации в разделе "Кто имеет доступ к приложению:" вам нужно выбрать любого, даже анонимного).
NB: я помещаю все в один и тот же скрипт для товара (вы можете разделить его на два разных скрипта это не проблема), и поскольку часть B должна быть доступна анонимным лицам, я не могу автоматически получить адрес электронной почты в части A, поэтому я немного изменил то, что было сделано здесь.