【问题标题】:Passing variables between functions by reference in Google Apps Script在 Google Apps 脚本中通过引用在函数之间传递变量
【发布时间】:2020-01-27 04:29:45
【问题描述】:

我对 Google Apps 脚本非常陌生,几天前才开始学习它。我以前有 C++ 知识,但没有更多。

我尝试编写我的第一个脚本,在 Google 表格上执行一些操作。这是我到目前为止创建的代码:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();

function MainFunc() {
  var LoopCounter = 0;
  SaveDataInArray(LoopCounter);
  Logger.log(LoopCounter);
}

function SaveDataInArray(LoopCounter) {
  var InfiniteForLoopTrigger = 1;
  var range;
  var VolumeArray = [];
  var SignalArray = [];

  //Save Data in Array
  for(var i = 2; InfiniteForLoopTrigger > 0; i++){
    range = s.getRange(i, 1);
    if(range.isBlank()){
      break;
    }
    VolumeArray[LoopCounter] = s.getRange(i, 1).getValue();
    SignalArray[LoopCounter] = s.getRange(i, 2).getValue();
    LoopCounter++;
  }
}

我意识到 LoopCounter 的值在被传递给函数 SaveDataInArray 后并没有改变。我知道在参数前面有一个 & 符号,比如

function SaveDataInArray(& LoopCounter)

帮助解决 C++ 中的问题,但我不知道如何在 Google Apps 脚本中处理它。

如果有人可以帮助我,我会很高兴。 谢谢和最好的问候, 最大

【问题讨论】:

  • 在 js 中,原语总是通过值传递,而对象总是通过引用传递。因此,您可以通过在函数之间传递配置对象并使用其中一个属性来共享状态来构建一个简单的解决方案。

标签: javascript google-apps-script pass-by-reference


【解决方案1】:
  • 您想使用 Google Apps 脚本通过引用调用值。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

问题和解决方法:

很遗憾,数字和字符串的变量不能用作引用调用。例如,当运行以下脚本时,0.0, 0, 1.0, 1.0 可以在Logger.log 看到。

function work(a, b, c, d) {
  a = 1;
  b = "1";
  c[0] = 1;
  d.value = 1;
}

function run() {
  var a = 0;
  var b = "0";
  var c = [0];
  var d = {value: 0};
  work(a, b, c, d);
  Logger.log("%s, %s, %s, %s", a, b, c[0], d.value) // 0.0, 0, 1.0, 1.0
}

所以,在这种情况下,请使用如下对象。

模式一:

在此模式中,数组用作对象。

function MainFunc() {
  var LoopCounter = [0];
  SaveDataInArray(LoopCounter);
  Logger.log(LoopCounter[0]);
}

function SaveDataInArray(LoopCounter) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var InfiniteForLoopTrigger = 1;
  var range;
  var VolumeArray = [];
  var SignalArray = [];

  //Save Data in Array
  for(var i = 2; InfiniteForLoopTrigger > 0; i++){
    range = s.getRange(i, 1);
    if(range.isBlank()){
      break;
    }
    VolumeArray[LoopCounter[0]] = s.getRange(i, 1).getValue();
    SignalArray[LoopCounter[0]] = s.getRange(i, 2).getValue();
    LoopCounter[0]++;
  }
}

模式 2:

在此模式中,使用 JSON 对象作为对象。

function MainFunc() {
  var LoopCounter = {value: 0};
  SaveDataInArray(LoopCounter);
  Logger.log(LoopCounter.value);
}

function SaveDataInArray(LoopCounter) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var InfiniteForLoopTrigger = 1;
  var range;
  var VolumeArray = [];
  var SignalArray = [];

  //Save Data in Array
  for(var i = 2; InfiniteForLoopTrigger > 0; i++){
    range = s.getRange(i, 1);
    if(range.isBlank()){
      break;
    }
    VolumeArray[LoopCounter.value] = s.getRange(i, 1).getValue();
    SignalArray[LoopCounter.value] = s.getRange(i, 2).getValue();
    LoopCounter.value++;
  }
}

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 谢谢,这是我在 Stack Overflow 上的第一个问题,您确实找到了答案。它真的帮助了我。感谢您还用我自己的代码展示它,因为它让我更容易获得它!
  • @maxgotstuck 感谢您的回复。很高兴您的问题得到解决。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2011-10-15
相关资源
最近更新 更多