Google apps script 如何将参数从一个GoogleApps脚本传递到另一个脚本并执行? 目标是将数据从GoogleApps脚本A传递到GoogleApps脚本 B 脚本A以“执行为用户”权限发布 脚本B以“以我的身份执行”权限(所有者)发布

Google apps script 如何将参数从一个GoogleApps脚本传递到另一个脚本并执行? 目标是将数据从GoogleApps脚本A传递到GoogleApps脚本 B 脚本A以“执行为用户”权限发布 脚本B以“以我的身份执行”权限(所有者)发布,google-apps-script,Google Apps Script,至少我希望能够将Session.getActiveUser.getEmail()从脚本A传递到脚本B 这就是我目前所拥有的 脚本A 脚本B 输出 要编写脚本,页面将加载按钮。单击该按钮将导致“Hello World!”登录到脚本A的项目日志中,但脚本B的项目日志仍为空。 TryCatch不会记录任何错误。我认为您的问题是因为您试图将uiapp元素作为响应参数传递。 这里是html服务中脚本的一个小变化。 剧本: // #### Part A function doGet(e) { var

至少我希望能够将
Session.getActiveUser.getEmail()从脚本A传递到脚本B

这就是我目前所拥有的

脚本A 脚本B 输出 要编写脚本,页面将加载按钮。单击该按钮将导致“Hello World!”登录到脚本A的项目日志中,但脚本B的项目日志仍为空。
TryCatch不会记录任何错误。

我认为您的问题是因为您试图将uiapp元素作为响应参数传递。 这里是html服务中脚本的一个小变化。

剧本:

// #### 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);
}
/#####A部分
函数doGet(e){
var html=”“;//要传递给脚本B的文本
html+=“”;//显示脚本B答案的位置
html+=“”;
html+=“函数myClick(){google.script.run.withSuccessHandler(showResults).myClickHandler(document.getElementById('text').value);}”;//在脚本A中执行作业的处理程序
html+=“函数showResults(result){document.getElementById('output').innerHTML=result;}”;//用于显示urlfetch结果的函数(脚本B的响应)
返回HtmlService.createHtmlOutput(html);
}
函数myClickHandler(文本){
var url=ScriptApp.getService().getUrl();
var有效负载={
名称:“基因”,
文本:文本,
时间:新日期()
};
var params={
方法:“张贴”,
有效载荷:有效载荷
}
Logger.log(“文本:”+文本);
var-HTTPResponse;
试一试{
HTTPResponse=UrlFetchApp.fetch(url,参数);
}捕获(e){
Logger.log(e);
}
返回HTTPResponse.getContentText();
}
//B部分
函数doPost(e){
如果(类型e==‘未定义’){
返回“e为空!!”;
}
var htmlOut=“
    ”; for(e.参数中的变量i){ htmlOut+=“
  • ”+i+”:“+e.参数[i]+”
  • ”; 如果(i==“文本”){ htmlOut+=“
  • 文本哈希:“+Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,e.parameter[i]))+”
  • ”; } } htmlOut+=“
”; 返回ContentService.createTextOutput(htmlOut); }
请务必注意,您将无法获取脚本B的记录器事件(因为它是在您不在时触发的-您不是触发脚本B的人。这是脚本A,它是触发脚本B,脚本A在进行urlfetch时未标识为“您”)。如果要获得脚本b记录器的结果,应将其返回到脚本a。 需要注意的是:同样,当脚本A对脚本B执行UrlFetch时,它没有标识为“您”,因此脚本B必须接受任何人打开(在“谁有权访问应用程序:”下的发布选项中,您需要选择任何人,甚至匿名)


注:我将商品的所有内容都放在同一个脚本中(您可以将其拆分为两个不同的脚本,这不是问题),因为B部分需要匿名访问,我无法自动检索a部分中的电子邮件地址,因此我对此处所做的做了一些更改。

您是否记录了thée.parameter.netId值?ils巡回赛的具体问题是什么?与我之前的情况相比,我无法获得任何记录值。我在脚本1中放置了一个表单,并使用该表单将文本传递给脚本2,结果成功了(传递文本并使用它添加工作表)。我现在做的事情很奇怪。UrlFetchApp的httpResponse是一个google登录页面,它不起作用,只会将您重定向到实际登录(即使已经登录),当您登录时,它会将您重定向到脚本2的doGet函数,该函数会抛出一个错误。更新:我在参数中添加了“followRedirects”:false,并获得一个“暂时移动文档已移动”您确定您部署的版本没有使用脚本2的.dev url吗?这是一个有趣的技术。我面临着基本相同的问题:)。你说:要在这里编写脚本,页面将加载按钮。单击该按钮将导致“Hello World!”登录到脚本A的项目日志中,但脚本B的项目日志仍为空。我点击了你的链接,你的代码似乎工作了,因为脚本B按钮有我的电子邮件地址。奇怪的是,脚本B logger无法工作,但看起来确实在传递参数——这已经很好了!(谢谢!)我已经尝试了很多不同的方法,取得了不同的成功,当然也很喜欢你的方法。我想让它适应你想要运行两个应用的场景。顺便说一句,这个解决方案不允许我在调用新的web应用程序时携带参数。这基本上就是我想做的,但这个问题并没有提供代码。对你的代码有什么建议吗?澄清:与我引用的例子不同,我想实际打开第二个应用程序进行交互,并拥有两种不同的授权:对于脚本A:用户;对于B:me@wgw如果我理解,您希望这两个脚本在活动时交换数据。当脚本1从脚本2接收到新数据时,它将自动更新其显示。上面的脚本在这里没有用处,它们只在第一次调用时交换数据。我认为没有一个干净的解决办法。但是,这里我可以建议您:在客户端(html服务)创建一个函数,该函数将定期获取服务器数据。在服务器端,该函数使用另一个脚本检查共享的电子表格,并返回数据。它既不干净也不快,但我没有其他想法。祝你好运,谢谢!更简单的场景是打开第二个webapp窗口,其中包含从第一个webapp传递的参数。第一个应用程序(脚本A)中的html链接可以实现这一点。但我想传递的不仅仅是一个参数;我想传递客户的电子邮件地址,以及客户在调用第二个应用时登录到谷歌的事实(第一个应用识别
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;
}
// #### 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);
}