Как передать параметры из одного 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, поэтому я немного изменил то, что было сделано здесь.