使用模板变量作为脚本 src 的一部分

use*_*129 1 javascript jquery paypal google-apps-script

我正在尝试创建一个模型支付弹出窗口,用户可以在其中升级他们在谷歌应用程序脚本中的计划。在我的.gs文件中,我有:

function manageSubscription() {
  var title = 'subscribe';
  var html = HtmlService.createTemplateFromFile('subscribe');
  html.email = Session.getActiveUser().getEmail();
  var htmlOutput = html.evaluate();
  htmlOutput.setTitle(title).setWidth(200).setHeight(200)
  DocumentApp.getUi().showModalDialog(htmlOutput, title);
}

Run Code Online (Sandbox Code Playgroud)

在我的.html文件中,我试图在他们注册时使用该电子邮件地址将其传递给 paypal:

  <script id="paypal_js"></script> // how do I set the src???
  <script>
  $(document).ready(function(){
    var src = 'https://www.paypal.com/sdk/js?client-id=my-client-id&email=';
    document.getElementById('paypal_js').src = src+<?= email ?>;

    paypal.Buttons({
      createSubscription: function(data, actions) {
        return actions.subscription.create({'plan_id': 'P-my-plan'});
      },
      onApprove: function(data, actions) {
        google.script.host.close();
      }
    }).render('#paypal-button-container');
  });
  </script>
Run Code Online (Sandbox Code Playgroud)

但是,我进入ReferenceError: paypal is not defined了浏览器控制台。奇怪的是,我可以做一个简单的 'alert();' 并看到我收到了电子邮件。

小智 5

问题在于您的代码正在使用paypal,您正在动态添加script,我假设您paypal将从该脚本中获取全局对象。

您忘记的是,在您的代码执行时paypal.Buttonspaypal在浏览器中不可用。因为,它仍然可能从脚本中获取和评估代码,您刚刚包括在内。您必须侦听脚本 onload 事件并在此之后调用所需的函数。

<script id="paypal_js"></script> // how do I set the src???
  <script>
  $(document).ready(function(){
    var src = 'https://www.paypal.com/sdk/js?client-id=my-client-id&email=';
    var scriptTag = document.getElementById('paypal_js')
    scriptTag.src = src+<?= email ?>;

    scriptTag.onload = function() {
      paypal.Buttons({
        createSubscription: function(data, actions) {
          return actions.subscription.create({'plan_id': 'P-my-plan'});
        },
        onApprove: function(data, actions) {
          google.script.host.close();
        }
      }).render('#paypal-button-container');
    }
  });
  </script>
Run Code Online (Sandbox Code Playgroud)