【问题标题】:How to pass parameters from one Google-Apps-Script to another and execute?如何将参数从一个 Google-Apps-Script 传递到另一个并执行?
【发布时间】:2014-02-04 02:20:25
【问题描述】:
  • 目标是将数据从 Google Apps 脚本 A 传递到 Google Apps 脚本 B.
  • 脚本 A 以用户身份执行权限发布。
  • 脚本 B 以我的身份执行权限(所有者)发布。

至少我希望能够将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;
}

脚本 B

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;
}

输出

转到脚本 A here 页面加载按钮。单击该按钮会导致“Hello World!”将被记录在脚本 A 的项目日志中,但脚本 B 的项目日志仍然为空。 TryCatch 不会记录任何错误。

【问题讨论】:

  • 您是否记录了 e.parameter.netId 值?究竟是什么旅游问题?
  • 在我无法获得任何记录值之前所拥有的。我在脚本 1 中放置了一个表单,并使用将文本传递给脚本 2 并且它起作用了(传递文本并使用它来添加工作表)。我现在拥有的东西做了一些很奇怪的事情。 UrlFetchApp 的 httpResponse 是一个 google 登录页面,它不起作用,只会将您重定向到实际登录(即使已经登录),当您登录时会将您重定向到脚本 2 的 doGet 函数,该函数会引发错误。
  • 更新:我在参数中添加了 "followRedirects":false 并获得了 "Moved Temporarily The document has move here."
  • 您确定您的部署版本并且没有使用脚本 2 的 .dev 网址吗?
  • 有趣的技术。我面临着同样的问题:stackoverflow.com/questions/21506058/…)。你说:去脚本A这里页面加载按钮。单击该按钮会导致“Hello World!”要登录脚本 A 的项目日志,但脚本 B 的项目日志仍然为空。 我点击了您的链接,您的代码似乎可以工作,因为脚本 B 按钮有我的电子邮件地址。奇怪的是脚本 B logger 不起作用,但看起来参数正在传递——这已经很棒了! (谢谢!)

标签: google-apps-script


【解决方案1】:

我相信您的问题是由于您尝试将 uiapp 元素作为响应参数传递。 这是您在 html 服务中的脚本的一些变化。
demo
脚本:

// #### 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 时不会被识别为“你”)。如果你想得到脚本 b logger 的结果,你应该把它返回给脚本 a。 重要的是要注意:再次,当脚本 A 对脚本 B 执行 UrlFetch 时,它不会被标识为“您”,因此脚本 B 必须接受任何人打开(在“谁有权访问应用程序:”下的发布选项中)你需要选择任何人,甚至是匿名的)。

注意:我将所有内容放在同一个商品脚本中(您可以将其拆分为两个不同的脚本,这不是问题),并且因为 B 部分需要匿名人员访问,所以我无法自动检索邮件中的电子邮件地址A 部分,所以我稍微改变了这里所做的。

【讨论】:

  • 我尝试了很多不同的方法,取得了不同程度的成功,绝对喜欢你的。
  • 我想将此调整到您希望运行两个应用程序的场景。 AFAIK,当我调用一个新的网络应用程序时,这个解决方案不允许我携带参数。 stackoverflow.com/questions/13370072/… 本质上是我想要做的,但这个问题并没有提供可以做到这一点的代码。对您的代码的这种变化有什么建议吗?
  • 澄清:与我引用的示例不同,我想实际打开第二个应用程序进行交互,并且有两个不同的授权:对于脚本A:用户;对于 B:我。
  • @wgw 如果我理解的话,你希望这两个脚本在活着的时候交换数据。当脚本 1 收到来自 2 的新数据时,它会自动更新他的显示。上面的脚本在这里没有用,它们只在第一次调用时交换数据。我不相信存在一个干净的解决方案。但是,在这里我可以建议您:在客户端(html 服务)创建一个函数,该函数将定期获取服务器数据。在服务器端,该函数使用其他脚本检查共享电子表格并返回数据。它不干净也不快,但我没有其他想法。祝你的任务好运
  • 谢谢!更简单的场景是我打开第二个 webapp window 并使用从第一个 webapp 传递的参数。第一个应用程序(脚本 A)中的 html 链接将执行此操作。但我想传递的不仅仅是一个参数;我想将客户的电子邮件地址和客户在调用第二个应用程序时登录 Google 的事实传递给第二个应用程序(第一个应用程序识别用户并以任何人身份运行;第二个应用程序以我身份运行。)我可以通过电子邮件地址,但我不知道客户端仍然登录。如果我找到一个简洁的解决方案,我会在这里发布一个链接。再次感谢!
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多