应用程序脚本专用函数



在Google apps脚本文档中,有一个关于服务器端私有函数的页面。这应该说明,如果没有私有函数,服务器代码在用户浏览器中是可见的。谁能解释一下如何在浏览器中看到这样的服务器端功能?谢谢

请参阅:https://developers.google.com/apps-script/guides/html/communication#private_functions

服务器代码在用户的浏览器上永远不会可见,只有函数名称可见。私有函数隐藏了这些名称,但更重要的是,它们删除了前端直接调用它们的能力。

换句话说,私有函数允许您定义后端入口点,防止恶意用户绕过您可能拥有的某些检查并直接调用您的"内部"函数。

为了展示查看名称和调用任何非私有后端函数是多么容易,我提出了这个例子,我们检查google.script.run对象:

function myFunction() {}
function anotherFunction() {}
function privateFunction_() {}
function doGet() {
  return HtmlService.createHtmlOutput(
    '<p id="output"></p>'+
    "<script>var s = ''; for( var prop in google.script.run ) s+=prop+'<br>';"+
    "document.getElementById('output').innerHTML = s;</script>"
  );
}

下面是发布的示例:https://script.google.com/macros/s/AKfycbzk0d03iB1O3vVYVD_U7eONM357iOPlAn7RFxAeZKx34q1Ones/exec

及其源代码(同上):https://script.google.com/d/1WMY5jWblGl8U84WvVU_mZjHDg-6rGOoOPnKMF6m2bS_V-2g6IChBVDrg/edit

-- 在评论中回答问题

doGet函数不能设为私有,因为它的名称是固定/预定义的。但这并不是一个真正的问题,因为无论如何,这个函数都应该是一个入口点,并且由于您希望从用户的浏览器调用它,并且可以相应地进行参数检查等。

使用带有闭包的 IIFE

counter.gs

const Counter = (function() {
  const count = 0; // Private variable
  function increment() {
    count++; // Accessing the private variable
    console.log('Count:', count);
  }
  function decrement() {
    count--; // Accessing the private variable
    console.log('Count:', count);
  }
  return {
    increment,
    decrement
  };
})();

main.gs

Counter.increment(); // Output: Count: 1
Counter.increment(); // Output: Count: 2
Counter.decrement(); // Output: Count: 1

在上面的代码中,IIFE 用于创建一个闭包,该闭包封装了 count 变量和两个内部函数:递增和递减。count 变量是私有的,只能由内部函数访问。

IIFE 立即执行,返回一个引用内部函数(递增和递减)的对象。由于闭包,这些函数可以访问私有计数变量。

最新更新