1

所以我仍然在學習Javascript並試圖找到自己的方式。 我正在努力工作,這將節省我每週工作時間的幾小時。在while循環中的IF語句無法正常工作,我在哪裏出錯?

這是一個googlespread表的腳本。它意味着在列中查找關鍵值並相應地移動數據。然後,它應該按區域將數據拆分爲外部電子表格,並將其分配到各個選項卡中。

我認爲我有分裂的權利,但它似乎沒有工作是decidng什麼應該被移動,什麼不應該是。我很確定我的While循環以及while循環中的if語句可能有問題:(

如果有人能指出我的方法錯誤,我會非常感激。以下是完整的腳本。

應該移動的唯一項目如下: IF列AV =需要移除細節AND列AW不爲空且列AX不爲空並且列BC不爲空然後它應該推送到存檔。

OR

IF 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); 


} 



} 

回答

4
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循環內部賦值,而不是在它之前。

+0

這解決了我遇到的問題。使用Logger.log,我可以得到預期的結果。但是,當我添加'archive.push(values.splice(counter,1)[0]);'我得到錯誤與av,aw,ax vars :( – Munkey

1

嘗試用這種if

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

你必須將你的邏輯塊括號否則計算機有沒有辦法知道如何組的條件,在這種情況下結果取決於運營商的優先級。

編輯:我錯了,在JS &&的優先級高於||所以編程它不會改變任何東西,但卻是對代碼的清晰性和可讀性,把括號中的最佳實踐。

+0

完全一樣的陳述,但我同意,parens可以更容易地看到意圖。 –

+1

&&的優先級高於||所以它不會改變任何邏輯。 – Dehli

+0

Aww,好的,我的錯誤。我一直認爲情況正好相反,我太習慣了C.Buruleohm和其他人的C. – Biduleohm