在 Google Apps Script 中通过引用在函数之间传递变量

max*_*uck 4 javascript pass-by-reference google-apps-script

我对 Google Apps Script 真的很陌生,几天前才开始学习它。我以前有 C++ 方面的知识,但不多。

我试着写我的第一个脚本,在谷歌表上做一些动作。这是我到目前为止创建的代码:

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++;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

function SaveDataInArray(& LoopCounter)
Run Code Online (Sandbox Code Playgroud)

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

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

Tan*_*ike 5

  • 您希望使用 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
}
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,请使用如下所示的对象。

模式一:

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

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]++;
  }
}
Run Code Online (Sandbox Code Playgroud)

模式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++;
  }
}
Run Code Online (Sandbox Code Playgroud)

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