2017-05-09 8 views
1

複数の行を1つのGoogleシートから別のシートに同時に移動しようとしています。複数の行を別のシートに同時に移動する - 行をアーカイブして削除するGoogleスクリプト

私はすべての完全なジョブをアーカイブするために、一日の終わりにスクリプトを一度実行したいと思います。

私がまとめたスクリプトは、対象のセルが空白でない限り、一度に2行しか移動しません。理想的には、ループし続け、「完了」とマークされたジョブだけを移動します。

私が使用しているシートがhere

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Admin') 
     .addItem('Archive', 'archive') 
     .addToUi(); 
} 

function archive() 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Scheduled"); 
    var range = sheet.getRange('A5:Q200'); 
    var sheetToMoveTheRowTo = "Archive"; 
    var numRows = sheet.getLastRow(); 
    var row = sheet.getRange(5,1); 

    for (var row = 5; row < numRows; row++) 
    { 
    var status = sheet.getRange(row,1).getValue(); 

     if (status == "Complete") { 

    var targetSheet = ss.getSheetByName(sheetToMoveTheRowTo); 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    sheet.getRange(range.getRow(),1,1, sheet.getLastColumn()).moveTo(targetRange); 
    sheet.deleteRow(range.getRow()); 
    } 
    } 
} 

答えて

1

アーカイブ、Googleシート、移動、行、スプレッドシート、あなたが一度の操作でアーカイブするすべてのデータを設定する必要があり

を削除しています。 1回の操作ですべての行を削除することはできませんが、削除する行を保存してから行番号をループすることができます。

Link to Publicly Shared Spreadsheet with Code

私はこのような構造にするコードに設定したい:

function archive() { 
    var arrayOfRowsToArchive,data,i,lastColumn,L,numRows,range,rowsToDelete, 
     ss,sheet,sheetToMoveTheRowTo,startRow,status,targetSheet,thisRowsData; 

    //USER INPUT: 

    startRow = 5; 

    //END OF USER INPUT 

    ss = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet = ss.getSheetByName("Scheduled"); 
    sheetToMoveTheRowTo = "Archive"; 
    numRows = sheet.getLastRow(); 
    lastColumn = sheet.getLastColumn(); 

    arrayOfRowsToArchive = []; 
    rowsToDelete = []; 

    data = sheet.getRange(startRow, 1, numRows - startRow, lastColumn).getValues();//Get all values except the header rows 

    L = data.length; 

    for (i=0; i < L; i++) { 
    status = data[i][0]; 
    //Logger.log('status: ' + status); 

    if (status === "Complete") { 
     thisRowsData = data[i];//Only get inner array of data 
     //Logger.log('thisRowsData: ' + thisRowsData) 
     arrayOfRowsToArchive.push(thisRowsData);//Push one row of data to outer array 
     rowsToDelete.push(i+startRow);//Get the row number to delete later 
    } 
    } 

    targetSheet = ss.getSheetByName(sheetToMoveTheRowTo); 
    targetSheet.getRange(targetSheet.getLastRow()+1, 1, arrayOfRowsToArchive.length, arrayOfRowsToArchive[0].length) 
    .setValues(arrayOfRowsToArchive); 

    //Logger.log('rowsToDelete: ' + rowsToDelete) 

    for (i=rowsToDelete.length;i>0;i--) {//Delete from bottom up 
    Logger.log((i-1).toString()) 
    Logger.log('rowsToDelete[i-1]: ' + rowsToDelete[i-1]) 
    sheet.deleteRow(rowsToDelete[i-1]); 
    } 
} 
+0

@Sandysスクリプトに加えて、時間ベースのあなたが選択した場合、トリガは、毎日のように設定しますが。 https://developers.google.com/apps-script/guides/triggers/installable – OblongMedulla

+0

「リターンキー」の意味がわかりません。 –

+0

助けてくれてありがとう。 には戻りキーの操作方法がわかりませんでした。 はまだ問題があります。スクリプトは、一度に2つのヘッダー行を削除します。 ヘッダー行を削除した後、A5のステータスが「完了」の場合、最初の2行が先頭から移動します。 A5のステータスが空白または '進行中'で、ヘッダー行が削除されると、次のエラーが発生します。 TypeError:未定義からプロパティ "長さ"を読み取ることができません – cmccnn

関連する問題