Google Apps脚本变量重新分配

时间:2015-07-13 07:40:45

标签: javascript arrays google-apps-script

我正在努力建立一年的员工日程安排,一周中不同的日子需要不同数量的员工。我想将名单输出到Google电子表格

我的方法是拥有一个包含所有员工姓名的数组,然后在一年中的每一天都清空员工数组中的x个名字。 X等于staff.length - 今天需要多少人。

我写了代码,输出不是我的预期。第一天看起来是正确的,但是每隔一天都会返回一个空数组。

var 员工已初始化&在LoC3上分配。但是在LoC12上,当我有职员的日志输出时,我看到一个空数组。我可以看到将一个空数组分配给 rosterToday 的结果是 rosterFull 是空的,但我不明白将员工设置为什么[,,,,,,]

此外,如果我删除了LoC17(rosterToday [i] =“”),员工的幻像重新分配似乎消失了。

有谁知道我在这里做错了什么?

function RosterTest()
{
  var staff = ["Adam", "Bob", "Chris", "Dave", "Ed", "Fred", "Garry"];
  var dailyRequirement = [0, 6, 7, 7, 7, 6, 2]; // num staff needed today
  var rosterFull = []; // push each day's roster in here
  var period = 7; // test with only 7 days, then ramp up to 365

  for (var d=0; d<period; d++)
  {
    var rosterToday = staff; // initially start with the full roster
    var reduce = staff.length - dailyRequirement[d];
    Logger.log("d="+d+" staff="+staff);
    // when d>=1 staff becomes [, , , , , , ]

    for (var i=0; i<reduce; i++)
    {
      rosterToday[i] = "";
    }
    rosterFull.push(rosterToday);
  }
  for (var i=0; i<rosterFull.length; i++)
  {Logger.log(rosterFull[i]);} // shows an arr of len 7 with empty arrs

  // spreadsheet.getRange(row, col, height, width).setValues(rosterWeek);
}

我知道这将始终优先考虑人员阵列中的前几名员工,但我已经有代码来改组他们。这只是一些孤立的行。

2 个答案:

答案 0 :(得分:0)

我不确定为什么人员阵列似乎是空的,但我认为这可能是尝试将二维数据集分配给一维数组的效果。您希望变量rosterFull包含每天所需的名称。这意味着您需要一个阵列,每天需要7 X的工作人员。

function RosterTest()
{
   var staff = ["Adam", "Bob", "Chris", "Dave", "Ed", "Fred", "Garry"];
   var dailyRequirement = [0, 6, 7, 7, 7, 6, 2]; // num staff needed today
   var period = 7; // test with only 7 days, then ramp up to 365
   var rosterFull = new Array(7); // create an array with 7 rows that represent the 7 days of the week

  for (var d=0; d<period; d++)
  {

    var rosterToday = [];

    for(var i=0; i<dailyRequirement[d]; i++){
      rosterToday[i] = staff[i];
    }

    rosterFull[d] = rosterToday; //assign the array with the required staff to the corresponding day.

  }

}

我不理解变量reduce。这会给你今天不需要的人数,而我想你想要的人数是多少。

答案 1 :(得分:0)

在没有深入了解您所询问的是您实际想要做什么的原因staff因为该行而在第一次运行后为空的原因

rosterToday = staff;

这会将工作人员指定为对rosterToday的引用 - 因此rosterToday[i]所做的全部内容也适用于staff。你需要把rosterToday复制一份。

rosterToday = staff.slice(); //makes a shallow copy of the array

这将解决该特定问题。

除此之外,你还可以使用Array.slice()

复制你在那里的内容
var rosterToday = [];
var rosterLength = staff.length;

for (var d = 0; d < dailyRequirement.length; d += 1) {

  rosterDay = staff
                .slice(0,dailyRequirement[d]-1)
                .concat(Array(rosterLength - d));
  rosterFull.push(rosterDay)

}

但我不相信这是你想要做的。