2013-11-26 163 views
0

我有一個電子表格,我想用它來存儲項目時間表。我有能力添加項目和他們的開始日期以及他們的長度,直到完成 - 這是在「項目」工作表。這通過單獨的工作表反映出來,具體爲每個項目設置特定顏色的細胞,具體取決於它們設置的日期 - 這是「時間軸」工作表。我想刪除一個項目時遇到問題。我想單擊項目名稱的單元格,然後從我創建的菜單中單擊「刪除項目」,然後在「項目」工作表和「時間線」工作表上刪除項目行。這個循環令我感到困惑,我並不完全理解它。我應該使用數組來存儲兩張紙上的項目名稱,然後使用它來相互引用,或者......?這是我到目前爲止。根據條件刪除數據行

function clearProject() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sourceSheet = ss.getSheetByName('Projects'); 
    var sourceRange = sourceSheet.getActiveRange(); 
    var height = sourceRange.getValues().length; 
    var rowPosition = sourceRange.getRowIndex(); 

    var targetSheet = ss.getSheetByName('Timeline'); 
    var targetSheetValues = targetSheet.getRange(3, 1, 15, 49); 
    var targetProjectNames = targetSheet.getRange(3, 1, 15, 1).getValues(); 
    var sourceProjectNames = sourceSheet.getRange(2, 1, 15, 1).getValues(); 

    var targetHeight = targetSheet.getRange(3, 1, 15, 1).length; 
    var targetRowPosition = targetSheet.getRange(3, 1, 15, 1).getRowIndex(); 

    for(var i=0; i > sourceProjectNames.length; i++){ 
    if(i == targetProjectNames){ 
     targetSheet.deleteRows(targetRowPosition, targetHeight); 
     } 
    else{ 
     break; 
    } 
    } 


    //This deletes the row of the active cell 
    //ss.getActiveSheet().deleteRows(rowPosition, height); 

    Logger.log(i); 

} 

另外,如果你知道任何解釋簡單英文循環的資源,請給我一個鏈接。感謝您的幫助!

編輯:在「if」語句中將=從比較改爲==。 編輯2:更改了for循環中的比較。另外,改變了什麼if聲明比較。

該循環仍然無法正常工作。當我檢查i的日誌時,我收到0.0。下面是新的代碼...

function clearProject() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sourceSheet = ss.getSheetByName('Projects'); 
    var sourceRange = sourceSheet.getActiveRange(); 
    var height = sourceRange.getValues().length; 
    var rowPosition = sourceRange.getRowIndex(); 

    var targetSheet = ss.getSheetByName('Timeline'); 
    var targetSheetValues = targetSheet.getRange(3, 1, 15, 49); 
    var sourceRangeValues = sourceSheet.getRange(2, 1, 15, 1); 
    var targetProjectNames = targetSheet.getRange(3, 1, 15, 1).getValues(); 
    var sourceProjectNames = sourceSheet.getRange(2, 1, 15, 1).getValues(); 

    var targetHeight = targetSheet.getRange(3, 1, 15, 1).length; 
    var targetRowPosition = targetSheet.getRange(3, 1, 15, 1).getRowIndex(); 

    for(var i=0; i < sourceRangeValues.length; i++){ 
    if(targetProjectNames[i][0] == sourceRange[i][0]){ 
     targetSheet.deleteRows(targetRowPosition, targetHeight); 
    Logger.log(i);  
    } 
    } 


    //This deletes the row of the active cell 
    //ss.getActiveSheet().deleteRows(rowPosition, height); 

    Logger.log(i); 

} 
+0

你的代碼中最大的問題不是循環,而是比較......看看一些關於JavaScript條件的doc,例如這裏:http://www.w3schools.com/js/js_comparisons.asp。和這裏。 http://www.w3schools.com/js/js_if_else.asp –

+0

我不敢相信我沒有抓到!我改變了比較,但我的代碼仍然無法正常工作。 – dericcain

+0

break語句阻止循環工作,因爲它總是處於活動狀態,將其移動到以下條件:if(... == ...){break} –

回答

1
  1. 我不認爲這個循環會不惜一切

for(var i=0; i > sourceProjectNames.length; i++)

它應該是

for(var i=0; i < sourceProjectNames.length; i++) 
運行甚至一度

2.你正在比較一個整數到一個不正確的二維數組

if(i == targetProjectNames)

相反,你應該這樣做。如果第一個比較失敗

if(targetProjectNames[i][0] == sourceProjectNames[i][0])

3.您break;語句將結束循環。因此,完全刪除其他部分

這些是我可以預先注意到的一些事情。如果您仍然看到問題,請嘗試使用更多信息編輯您的問題。

+0

謝謝你指出並耐心等待。 – dericcain

+0

我的意思是隨着「break」一起刪除else部分 - 根本不需要。刪除之後,請使用您看到的輸出更新問題 – Srik

+0

對不起。我刪除了'break',它仍然在做同樣的事情。 – dericcain