2016-07-08 5 views
1

4 권의 Google 스프레드 시트 통합 문서가 있습니다. '주'시트에는 처음 11 개의 열에 자동으로 데이터가 덤프됩니다. 12 번째 열은 수동 이동 트리거로 설정되어 선택한 열 데이터를 행 기준으로 대상 시트 (다른 ​​세 시트 중 하나)로 이동합니다. 예를 들어, 1, 4, 9 및 10 열과 같이 선택한 대상 시트로 원하는 열만 이동할 수 있습니다. 그러나 데이터가 이동하면 대상 시트에 채워지는 열입니다. 대신 대상 시트의 첫 번째 4 열로 데이터가 이동되기를 바랍니다. 나는 많은 포럼을 수색했으며 이것이 가능할 지 알 수 없다. 이것은 내 현재 스크립트입니다 : 내가 rangeToCopyTo 내가 생각할 수있는 모든 방법으로 조작 시도Google 스크립트는 행을 다른 스프레드 시트로 이동합니다.

function onEdit() { 

    // base definitions 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var editedSheet = ss.getActiveSheet(); 
    var editedCell = editedSheet.getActiveCell(); 
    var wordInCell = editedCell.getValue().toString(); 
    var moveSheet = "Main"; 
    var moveColumn = 12; 
    var moveWords = ["move5x", "move6x", "moveas"]; 
    var targetSheets = ["5x", "6x", "Assigned"]; 

    // if the edit was mot in the moveSheet jump out 
    var sheetIndex = moveSheet.indexOf(editedSheet.getName()); 
    if (sheetIndex == -1) return; 

    // if the edit was mot in the move column jump out 
    if (editedCell.getColumn() != moveColumn) return; 

    // if the value in editedCell isn't one of the move words, jump out 
    var moveWordsIndex = moveWords.indexOf(wordInCell); 
    if (moveWordsIndex == -1) return; 

    // if the value in editedCell is one of the move words, set up columnsToMove 
    var columnsToMove; 
    if (moveWordsIndex == 0 || moveWordsIndex == 1) {columnsToMove = [[1, 4], [8, 8]]}; 
    if (moveWordsIndex == 2) {columnsToMove = [[1, 1], [4, 4], [9, 10]]}; 

    // copy data from editedSheet's sourceRow to targetSheet's targetRow 
    var sourceRow = editedCell.getRow(); 
    var targetSheet = ss.getSheetByName(targetSheets[moveWordsIndex]); 
    var targetRow = targetSheet.getLastRow(); 
    targetSheet.insertRowAfter(targetRow++); 
    for (var i = 0; i < columnsToMove.length; i++) { 
    var startColumn = columnsToMove[i][0]; 
    var numColumns = columnsToMove[i][1] - startColumn + 1; 
    var numCopiedColumns = columnsToMove.length; 
    var rangeToCopyFrom = editedSheet.getRange(sourceRow, startColumn, 1, numColumns); 
    var rangeToCopyTo = targetSheet.getRange(targetRow, startColumn, 1, numColumns); 
    rangeToCopyFrom.copyTo(rangeToCopyTo); 
    } 
} 

,하지만 결과는 내가 무엇을 찾고 적이 없습니다. 선택한 열을 재정렬해도 가능하다는 것을 아는 사람이 있습니까? 그렇다면 나는 최소한 올바른 길을 가고 있습니까? 감사합니다.

+0

bobm

+0

안녕 @ 벤, 이후 이 포럼에 게시 한 것은 이번이 처음입니다. 스프레드 시트를 볼 수 있는지 여부는 확실하지 않습니다. 가능한 경우 5x, 6x 및 할당 된 시트의 2 행에 원하는 결과를 표시했습니다. 각 시트의 행 3은 실제 결과를 보여줍니다. – bobm

답변

0

왜 대상 범위의 시작 열을 1로 설정하지 않으시겠습니까?

var rangeToCopyTo = targetSheet.getRange(targetRow, 1, 1, numColumns); 

내가 올바르게하면 트릭을해야합니다. 꽤 비슷한 방식으로 작동하는 .getValues().setValues() 항목으로 이동할 수도 있습니다.

그리고 당신은 별도의 .setValue() 기능을 사용하는 방법도있다 :

for (var i = 0; i < columnsToMove.length; i++) { 
    var startColumn = columnsToMove[i][0]; 
    var numColumns = columnsToMove[i][1] - startColumn + 1; 
    var numCopiedColumns = columnsToMove.length; 
    var rangeToCopyFrom = editedSheet.getRange(sourceRow, startColumn, 1, numColumns).getValues(); 
    for (var i = 0; i < numCopiedColumns; i++) { 
     //here you insert your values into first 'numCopiedColumns' columns in the targetRow 
     targetSheet.getRange(targetRow, i + 1).setValue(rangeToCopyFrom[i]); 
    } 
} 

이 같은 데이터를 각각 별도의 값을 .setValue() 작업을 수행하는 대신에 붙여 넣을 그것은 아마도 더 많은 시간이 소요 될 것입니다 이 모든 것이 목표 열을 선택할 때 더 많은 자유를 줄 수 있습니다.

+0

복사 할 데이터를 배열로 가져와 조작하고 하나의 .setValues ​​메서드로 배열을 출력하면 여기로 갈 수 있습니다. –

관련 문제