2013-10-12 3 views
0

이것은 두 번째 질문으로 patt0에 의해 해결되었습니다.스프레드 시트 또는 스프레드 시트의 특정 시트에서 스크립트를 실행하고 조건에 따라 다른 시트로 데이터를 가져옵니다.

나는 시트를 편집 할 때마다 점검하는 편집 작업 스크립트가 있으며, 열 번호의 셀 값이 맞으면 편집 스크립트가 있습니다. 7이 "RECEBER"로 변경되면 전체 행을 다른 시트로 가져옵니다. 처음에는 그 일이 나를 위해 잘 작동하지만 onEdit에는 내가하고 싶은 것과 호환되지 않는 몇 가지 제한 사항이 있다는 것을 빨리 알게되었습니다.

나는 onEdit에 의존 할 수 없기 때문에 원할 때마다 (patt0에서 제안한대로) 작성된 메뉴에서 스크립트를 실행하려고합니다. 이것은 한꺼번에, 전체 스프레드 시트 및 시트별로 수행 할 수 있습니다 (두 가지 모두에 대한 솔루션이 비슷할 것으로 생각하며 두 가지 방법 모두 내게 매우 유용 할 것입니다). 여기

내가 한 코드입니다 (작동하지 않는 - 편집 코드에 이전에서 적응했다) :

이 첫 번째 부분은 1에서 31 사이에 있는지 확인하는 시트 이름을 저장한다;

function mustBeCopied(sheetName) { 
    var sheetNumber = parseInt(sheetName); 
    if (sheetNumber <=31 && sheetNumber >=1) 
    return true; 
    return false; 
} 

이 두 번째 부분은 onEdit 기능에서 가져온 것일 수 있습니다. 내가 무슨 일이 일어나고 있는지 이해하고 있습니다 있는지 확인하기 위해 단계 분석에 의해 단계를하고 있어요

function RECEBER() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); // stores the active spreadsheet (where the script is being ran) 
    var s = ss.getActiveSheet(); // stores the Active sheet within the stored spreadsheet 
    var r = ss.getActiveRange(); // stores the range of rows in my document ? 
    if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") { // if mustBeCopied, when applied to the sheet defined in the s variable is satisfied, it will check on every row if the value "RECEBER" is in its 7th column. 
    var row = r.getRow(); // stores the row that satisfied the condition 
    var numColumns = s.getLastColumn(); // stores the last column on the sheet ? 
    var targetSheet = s.getSheetByName("money"); // sets the target sheet 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // gets range on the target sheet and adds one more row for the new data to be inserted 
    s.getRange(row, 1, 1, numColumns).copyTo(target); // writes the data into the target sheet, but I don't understand how.. 
    } 
} 

..

나는이 아주 쉽게 할 수있는 확신, 그리고 배울 wiling 오전,하지만 난 그물에 해결책을 찾는 것처럼 보일 수 없다. 나는 이것이 이미 논의 된 주제라고 생각했다. 자동으로이 작업을 수행 할 수 있으면 매월 많은 시간을 절약 할 수 있습니다. 그것은 또한 컴퓨터에 의해 처리 될 것이므로 인간의 실수의 위험을 감소시킬 것입니다 ..

나는 누군가가 저를 도울 수 있기를 바랍니다. 고마워요.

답변

0

실행 스크립트 (보기 -> 실행 내역)를 사용하면 실행 스택을 관찰 할 수 있습니다 (오류가있을 수 있음).

다음 코드는 도움이 될 수 있습니다 : 필요에 따라

/* CODE FOR DEMONSTRATION PURPOSES */ 
function onEdit(e) { 
    var targetSheet = e.source.getSheetByName('money'), 
     range = e.range, 
     s = range.getSheet(), 
     lastColumn = s.getLastColumn(); 
    if (mustBeCopied(s.getName()) && range.getColumn() === 7 && e.value === 'RECEBER') 
    s.getRange(range.getRow(), 1, 1, lastColumn).copyTo(targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, lastColumn)); 
} 

을 조정합니다.

+0

답변 해 주셔서 감사합니다. 그러나 onEdit는 나를 위해 작동하지 않습니다. 붙여 넣기 명령에 응답하지 않습니다. 또한 시트에 데이터를 수동으로 삽입 할 때 열 7이 조건을 충족하는 값으로 채워지면 함수가 이미 트리거되었으므로 채워질 나머지 데이터는 복사되지 않습니다 .. –

+0

@ DiogoSousa 예를 들어 실행 기록을 확인하여 오류를 확인하는 등 가장 좋은 해결책을 찾으십시오. ''targetSheet = s.getSheetByName ("money"); 줄은's' (Sheet)에'getSheetByName' 메소드가 없으므로 에러를 주어야합니다. 코드는 코드에 적용하기위한 참조 일뿐입니다. – wchiquito

+0

당신이 말하는 것을 이해하지만 getSheetByName은 onEdit 함수에서 문제가되지 않았습니다. 왜 지금은 작동하지 않습니까? –

관련 문제