2013-01-01 59 views
0

我有一個電子表格,其中有一個清單要在事件發生前的60,30和1天填寫。這些表被稱爲「60天」,「30天」和「開球」。我試圖讓沒有被檢查的行自動添加到下一張表中(因此「60天」中的任何未經檢查的行都會被追加到「30天」,並且從「30天」到「開球」 - 同樣,通過「覈對」我的意思是一個「x」被輸入到一個單元格中)。我在代碼上有一個非常好的開端,但我一定是做錯了 - 因爲它似乎沒有做任何事情(原諒我的JavaScript無知,我的代碼入侵上週開始codecademy和一大堆瀏覽在這些論壇上)。我覺得我可能錯過了一些非常基本的東西,並且會歡迎我能得到的任何幫助。這是我得到的...有條件地將行復制到另一個工作表,並在更新行後將其刪除

function onEdit() { 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var r = ss.getActiveCell(); 
var i = 4;//have this number be your first row of data 

    if(r.getColumn()===5){ // this indicates the column that, if left blank, will mean the row should be copied to the next sheet 

    if (ss.getActiveSheet().getName()=="60-Day"){ 

     var source_sheet = ss.getSheetByName("60-Day"); 
     var target_sheet = ss.getSheetByName("30-Day"); 
     var last_row = target_sheet.getLastRow(); 

     while(i<=last_row){ 

     if(source_sheet.getValue("E"+i)!="x"){ 

      var source_range = source_sheet.getRange(i,2,1,6); // indicate the columns you'd like to copy 
      var target_range = target_sheet.getRange(last_row + 1,2,1,6); // indicate the columns where you'd like to paste 
      source_range.copyTo(target_range); 
      i++; 
      SpreadsheetApp.flush(); 
     }else{ 
     i++; 
     } 
     } 
}; 
    else if (ss.getActiveSheet().getName()=="30-Day"){ 
     var source_sheet = ss.getSheetByName("30-Day"); 
     var target_sheet = ss.getSheetByName("Kickoff"); 
     var last_row = target_sheet.getLastRow(); 

     while(i<=last_row){ 

     if(ss.getValue("E"+i)!="x"){ 

      var source_range = source_sheet.getRange(i,2,1,6);//indicate the columns you'd like to copy 
      var target_range = target_sheet.getRange(last_row + 1,2,1,6);//indicate the columns where you'd like to paste 
      source_range.copyTo(target_range); 
      i++; 
      SpreadsheetApp.flush(); 
     }else{ 
     i++; 
     } 
     }; 
    } 
} 
} 

所以那就是 - 這裏是我遇到更多麻煩的地方。如果一行已被推送到目標工作表並在目標工作表上檢查過,我希望它從目標工作表中消失,並且希望源工作表中的原始行現在顯示它已被檢查了。此外,如果在源表單上檢查到先前空白的行,我希望已推送到目標工作表的副本消失。這是我開始迷失方向的地方。我將如何去實施呢?

回答

0

想想你要在這個變化...

function onEdit() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var r = ss.getActiveCell(); 
    var i = 4;//have this number be your first row of data 

    if(r.getColumn()===5){ // this indicates the column that, if left blank, will mean the row should be copied to the next sheet 

    if (ss.getActiveSheet().getName()=="60-Day"){ 

     var source_sheet = ss.getSheetByName("60-Day"); 
     var target_sheet = ss.getSheetByName("30-Day"); 
     var source_last_row = source_sheet.getLastRow(); 
     var target_last_row = target_sheet.getLastRow() + 1; 

     while(i<=source_last_row){ 

     if(source_sheet.getRange("E"+i).getValue() !="x"){ 

      var source_range = source_sheet.getRange(i,2,1,6); // indicate the columns you'd like to copy 
      var target_range = target_sheet.getRange(target_last_row,2,1,6); // indicate the columns where you'd like to paste 
      source_range.copyTo(target_range); 
      //var new_last_row = target_last_row - 1; 
      source_sheet.deleteRow(i); // delete source row after copy 
      i++; 
      SpreadsheetApp.flush(); 
      target_sheet.getRange('E'+target_last_row).setValue('x'); // insert 'x' back into target 
     }else{ 
      i++; 
     } 
     } 
    } 
    else if (ss.getActiveSheet().getName()=="30-Day"){ 
     var source_sheet = ss.getSheetByName("30-Day"); 
     var target_sheet = ss.getSheetByName("Kickoff"); 
     var source_last_row = source_sheet.getLastRow(); 
     var target_last_row = target_sheet.getLastRow() + 1; 

     while(i<=source_last_row){ 

     if(source_sheet.getRange("E"+i).getValue() !="x"){ 

      var source_range = source_sheet.getRange(i,2,1,6);//indicate the columns you'd like to copy 
      var target_range = target_sheet.getRange(target_last_row,2,1,6);//indicate the columns where you'd like to paste 
      source_range.copyTo(target_range); 
      //var new_last_row = target_last_row - 1; 

      source_sheet.deleteRow(i); // delete source row after copy 
      i++; 
      SpreadsheetApp.flush(); 
      target_sheet.getRange('E'+target_last_row).setValue('x'); // insert 'x' back into target 
     }else{ 
      i++; 
     } 
     } 
    } 
    } 
} 
+0

嘿布萊恩!感謝您的幫助。出於某種原因,它似乎沒有工作。無論如何,我意識到我沒有真正解釋自己。理想情況下,我喜歡將該項目保留在原始工作表和複製到的工作表上,並且如果它在任一位置都檢查完畢,我希望原始更新和副本消失。我也在重新思考整個onEdit觸發器。我現在要讓腳本可以從菜單中啓動。 – DaneC

+0

如果您希望在所有工作表中刪除它們,則必須在每行中搜索與您正在檢查的行相匹配的值。 –

+0

我最終做的是編寫4個不同的功能(每個功能從菜單中啓動),一個將信息從60天移至30天,一個將信息從30天移至啓動,一個重置30天,還有一個重置開球。我不得不採取一些硬編碼,並且腳本緩慢,因爲它貫穿每一行,但它的工作原理。它需要用戶比我想要的更警惕一些,但是可以正常工作。 – DaneC

相關問題