2

バックグラウンド:

私は大家族の一員であり、クリスマスにみんなにお金を節約するために、贈り物としてシークレットサンタのようなものをしています. 私たちのプロセスはやや面倒なので、スプレッドシートですべて管理できるように、このスクリプトを書いています。ルールは次のとおりです。

  1. それぞれの「サンタ」には 2 つの名前が付けられ、プレゼントを購入する必要があります。
  2. これら 2 つの名前を同じにすることはできません。
  3. カップルはお互いや子供に贈り物をすることはできません。子供は兄弟姉妹や両親に贈り物をすることはできません。

以下は、いくつかのサンプル データを含むテーブルです。 サンプルデータ

問題

私の問題は、次のコードが原因で発生していると思います。

//Remove disallowedNames from currentAvailableNames
for (j=0; j<disallowed.length; j++){
  var disallowedName = disallowed[j];
  currentAvailableNames.splice(currentAvailableNames.indexOf(disallowed[j]), 1);
}

何らかの理由で、許可されていない名前も availableNames 配列から削除されていますが、その理由はわかりません。私が「修正」できた唯一の方法は、受信者が選択された後に次のコードを追加することです。

//Add Disallowed Names back to Available Names Array
for (k=0; k<disallowed.length; k++){
  var disallowedName = disallowed[k];
  if (disallowedName.length >0) {
    availableNames.push(disallowedName);
  }
}

オリジナルコード

function giftAssignments() {
  //Get Settings
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var settings = ss.getSheetByName("Settings");
  var resultsSheet = ss.getSheetByName("Results");
  var numOfAssignments = settings.getRange("B2").getValue();
  var minPrice = settings.getRange("B3").getValue();
  var maxPrice = settings.getRange("B4").getValue();
  var firstName = settings.getRange("B5").getValue();
  var santasLastRow = settings.getLastRow();
  var santasLastCol = settings.getLastColumn();
  var santasTotal = santasLastRow - firstName + 1;
  var santasAsRange = settings.getRange(firstName,1,(santasLastRow - firstName + 1), santasLastCol).getValues();

  //Create Santas Array (santas)
  var santas = []
  for (var i=0; i<santasAsRange.length; i++) {
    var name = santasAsRange[i][0];
    var email = santasAsRange[i][1];
    var disallowedAsString = santasAsRange[i][2];
    disallowedAsString = disallowedAsString.replace(", ",",");
    var disallowed =  disallowedAsString.split(",");
    disallowed.push(name);
    var santa = [];
    santa[0] = name;
    santa[1] = email;
    santa[2] = disallowed;
    santas.push(santa);
  }
  //Create Array of Names (availableNames)
  var availableNames = [];
  for (i=0; i<santas.length; i++) {
    var aName = santas[i][0];
    availableNames.push(aName);
  }
  //Assign Recipients
  var results = assignRecip(santas, availableNames);
  Logger.log("RESULTS = " + results);
}


function assignRecip(santas, names) {
  var availableNames = names;
  for (i=0; i<santas.length; i++) {
    var currentAvailableNames = availableNames;
    var name = santas[i][0];
    var disallowed = santas[i][2];
    Logger.log("Santa = " + name);
    Logger.log("availableNames = " + availableNames);

    //Remove disallowedNames from currentAvailableNames
    for (j=0; j<disallowed.length; j++){
      var disallowedName = disallowed[j];
      currentAvailableNames.splice(currentAvailableNames.indexOf(disallowed[j]), 1);
    }
    Logger.log("currentAvailableNames = " + currentAvailableNames);

    //Pick Random Ricipient from currentAvailableNames
    var recipient = currentAvailableNames[Math.floor(Math.random() * currentAvailableNames.length)];
    Logger.log("Recipient = " + recipient); 

    //Add Recipient to Santa Array
    santas[i].push(recipient);

    //Add Disallowed Names back to Available Names Array
    for (k=0; k<disallowed.length; k++){
      var disallowedName = disallowed[k];
      if (disallowedName.length >0) {
        availableNames.push(disallowedName);
      }
    }

    //Add Recipient to Disallowed Names Array
    santas[i][2].push(recipient);

    //Remove Recipient from Available Names Array
    availableNames.splice(availableNames.indexOf(recipient),1);
    Logger.log("availableNames = " + availableNames);
    Logger.log(" ");
  }
  return santas;
}
4

1 に答える 1

4

それらは同じ配列への参照です。このコードは配列自体をコピーしません。配列への参照をコピーします。

var currentAvailableNames = availableNames;

を使用して修正できます.slice()

var currentAvailableNames = availableNames.slice();

これで 2 つの別個の配列ができたので、 を直接変更しても には影響しcurrentAvailableNamesませんavailableNames

これは浅いクローンであることに注意してください。オブジェクトの配列または配列の場合、ネストされたオブジェクトへの変更は、両方の配列から引き続き表示されます。

于 2012-10-30T19:30:19.330 に答える