谷歌应用程序脚本-如何获取arguments.callee.caller



我正试图通过使用arguments.callee.caller来查找调用我的Google Apps Script函数的函数的名称,如"如何在JavaScript中查找调用方函数?"中所述?,但似乎没有这样的财产出口。(但是,arguments.callee存在。)

如何在Google Apps脚本中获取调用函数的名称?

作为第二个问题,为什么没有arguments.callee.caller

我做了这个函数:

function getCaller()
{
  var stack;
  var ret = "";
    try 
    {
      throw new Error("Whoops!");
    } 
    catch (e) 
    {
      stack = e.stack;
    }
    finally
    {
      var matchArr = stack.match(/(.*)/g);
      if (matchArr.length > 2)
      {
        tmp = matchArr[2];
        ret = tmp.slice(1, tmp.length - 1) + "()";
      }
      return ret;
    }
}

它抛出Error(),然后从堆栈跟踪中获取函数名。使用包装时,请尝试更改matchArr[2]中的"2"。

caller是JavaScript的非标准扩展(也就是说,许多浏览器都有它,但它不是EcmaScript标准的一部分),并且没有在Apps Script中实现。

我根据jgrotius的回答做了一个函数来获取调用堆栈:

  function getCallStack()
  {
    var returnValue = "";
    var framePattern = /sat (.+?):(d+) ((.+?))/;
    try 
    {
      throw new Error('');
    } 
    catch (e) 
    {
      returnValue = e.stack
      .split('n')
      .filter(function(frame, index) {
        return !frame.isBlank() && index > 0;
      })
      // at app/lib/debug:21 (getCaller)
      .map(function(frame) {
        var parts = frame.match(framePattern);
        return {
          file: parts[1],
          line: parseInt(parts[2]),
          func: parts[3]
        };
      });
    }
    return returnValue;
  }  

这是我提出的另外两个解决方案的更新版本:

const getStacktrace = () => {
  try {
    throw new Error('')
  } catch (exception) {
    // example: at getStacktrace (helper:6:11)
    const regex = /sat (.+?) ((.+?):(d+):(d+))/
    return exception
      .stack
      .split('n')
      .slice(1, -1)
      .filter((frame, index) => {
        return frame && index > 0
      })
      .map((frame) => {
        const parts = frame.match(regex)
        return {
          function: parts[1],
          file: parts[2],
          line: parseInt(parts[3]),
          column: parseInt(parts[4])
        }
    })
  }
}

附言:请注意,regex已经更改,而且我们忽略了stacktrace的第一个元素,因为它是getStacktrace函数本身。

相关内容

最新更新