如何将参数从一个Google-Apps-Script传递到另一个并执行?

时间:2014-02-01 13:20:04

标签: google-apps-script

  • 目标是将数据从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不会记录任何错误。

1 个答案:

答案 0 :(得分:6)

我相信你的问题是因为你试图将一个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部分所以我改变了一些在这里完成的工作。