一段时间循环中的 IF 语句不起作用,我哪里出错了

IF statement in a while loop not working, Where am I going wrong?

本文关键字:出错 错了 不起作用 循环 IF 语句 一段时间      更新时间:2023-09-26

所以我仍在学习Javascript并试图找到自己的方式。我正在努力工作,为我每周节省数小时的工作时间。

这是一个谷歌电子表格的脚本。它旨在查找列中的键值并相应地移动数据。然后,它应按区域将数据拆分为外部电子表格,并拆分为单独的选项卡。

我想我的拆分位是正确的,但它似乎不起作用的地方决定了什么应该移动,什么不应该移动。我很确定我的 While 循环有问题,也可能是 while 循环中的 if 语句有问题:(

如果有人能指出我的方式错误,我将不胜感激。这是完整的脚本。

唯一应移动的项目如下。如果列 AV = 需要删除详细信息,并且列 AW 不为空,AX 列不为空。和列 BC 不为空。然后应该将其推送到存档。

如果 AV 为空且

aw 不为空且 bc 不为空。那么这也应该被推送到存档。

非常感谢

function testNinja(){

var sourceSheet = "Change of details requests";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sourceSheet);
var values = sheet.getDataRange().getValues();
var valuesLength = values.length;
var archive = [];
var counter = 1;
var agentSheet = "ID HERE";
// To make things easier, I've defined the worksheet names and the region names into arrays. Position is important, as entry 0 matches entry 0
var regionSheets = ["R/North East&Yorks","R/North West","R/South East","D/South London","D/East","D/North London","M/Midlands","M/Wales&S.West","M/Scotland/N.Ireland"];
var regionNames = ["North East & Yorks","North West","South East","South London","East England","North London","Midlands","Wales & S West","Scotland & N Ireland"];
// giving key columns & key values a var to save typing. Using column letters as var name.
  var av = values[counter][47];
  var aw = values[counter][48];
  var ax = values[counter][49];
  var bc = values[counter][54];
  var bf = values[counter][57];
  var bk = "Need to Remove Details";
  var sf = "SET SF TASK";

// put matching values into an archive. This bit doesn't seem to be working correctly
  while(counter < valuesLength)

{ 
if (bf == sf)
    {
    counter++;
    }
     if(av == bk && aw != "" && ax != "" && bc != "" || av == "" && aw != "" && bc !="")
    {
      archive.push(values.splice(counter, 1)[0]); 
    }
    else
    {
    counter++;
    }

  }

// create a function called 'move' to move columns into new positions
Array.prototype.move = function (old_index, new_index) {
    if (new_index >= this.length) {
        var k = new_index - this.length;
        while ((k--) + 1) {
            this.push(undefined);
        }
    }
    this.splice(new_index, 0, this.splice(old_index, 1)[0]);
}
//go through the archive, use the move function, and trim the end columns. Finally add a timestamp
var timestamp = new Date();
for (var i = 0;i<archive.length;i++)
{
archive[i].move(68,5);
archive[i].length = 73;
archive[i][61] = timestamp;
}

// Split the data by region. There is a region value in Column 65. This determinds what Sheet data is moved too.
var regionData = [];
var regionSs = SpreadsheetApp.openById(agentSheet);
for(var i = 0; i < regionSheets.length;i++){
var regionSheet = regionSs.getSheetByName(regionSheets[i]);
var regionName = regionNames[i];
for(var j = 0; j < archive.length;j++){
var value = archive[j][66];
if(value == regionName){
regionData.push(archive.splice(j, 1)[0]);

}

}
//Write data to sheet here.
 var regionDataLength = regionData.length;
  if (!regionDataLength) continue; 
  var lastRow = regionSheet.getLastRow();
  var requiredRows = lastRow + regionDataLength - regionSheet.getMaxRows();
  if (requiredRows > 0) regionSheet.insertRowsAfter(lastRow, requiredRows);
  regionSheet.getRange(lastRow + 1, 1, regionDataLength, regionData[0].length).setValues(regionData);
// clear array for new region data
  regionData = [];
// Get data validation from CC2, then apply to CC2:CC .
var CCrule = regionSheet.getRange("CC2").getDataValidation();
regionSheet.getRange("CC2:CC").setDataValidation(CCrule);

}

}
var counter = 1;
//...
var bf = values[counter][57];
//...
var sf = "SET SF TASK";
//...
while(counter < valuesLength)
{ 
if (bf == sf)
  {
    counter++;
  }
//...

我认为问题在于对变量bf(和其他变量)的赋值。您正在将values[1][57]分配给bf,因此在计数器增加时实际上并没有遍历列(如果values[1][57] != sf,它永远不会)。

因此,如果您想使用列标识符来保存键入,我认为您需要在 while 循环中分配值,而不是在它之前。

试试这个if

if ((av == bk && aw != "" && ax != "" && bc != "") || (av == "" && aw != "" && bc !=""))

您必须在逻辑块两边加上括号,否则计算机无法知道如何对条件进行分组,在这种情况下,结果取决于运算符优先级。

编辑:我错了,在JS中&&的优先级高于||因此以编程方式不会更改任何内容,但是对于代码的清晰度和可读性而言

,这是最佳实践。