2017-12-18 3 views
0

셀을 복사 할 수있는 스크립트를 만들었습니다. OnEdit (시트 2의 col16) Col16 = "예") (현재 Col4)의 사용자 정의 열의 마지막 행에. 그러나 저는 에 대한 쿼리 기반 데이터를 가지고 있으므로 손으로 "Yes"를 입력 할 때만 내 스크립트가 데이터를 복사합니다. 이것이 바로이 스크립트를 버튼으로 실행해야하는 이유입니다. 시간 주도 트리거로 사용할 수도 있습니다. 단추로 작동하지 않습니다. 버튼을 클릭하여 작업 할 수 있도록 다음 스크립트를 어떻게 변경합니까?OnEdit 스크립트를 Run-by-button 스크립트로 변환하는 방법 (규칙을 사용하여 셀을 다른 시트로 복사)

function onEdit(e) { 
    var ss = SpreadsheetApp.getActive(); 
    var sheet = ss.getActiveSheet(); 
if (sheet.getName() !== '2' || e.range.getColumn() !== 16 || e.value !== 'Yes') return; 
    var value = e.range.offset(0,-12,1,1).getValue(); 
    sheet = e.source.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sheet.getRange(maxIndex+2,e.range.getColumn()-12,1,1).setValue(value); 
} 

업데이트 :이처럼 내 스크립트를 변경하려 버튼에 할당 한, 그것은 "..... 다음 완료 러닝 ..."라고하지만, 그것을 버튼 - 클릭 후 아무것도 복사하지 마십시오 (하지만 OnEdit (e) 일 때 작동하며 오류가 나타나지 않습니다.) 하지만 "OnEdit (e)"에서 "copymissings()"로 변경하는 것만으로는 충분하지 않습니다. . 코드에서 뭔가,하지만 난 정확하게 도와주세요 모르겠어요 :

function copymissings() { 
    var s = SpreadsheetApp.getActive(); 
    if (s.getName() !== '2' || range.getColumn() !== 16 || value !== 'Yes') return; 
    var value = range.offset(0,-12,1,1).getValues(); 
    sht = s.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sht.getRange(maxIndex+2,range.getColumn()-12,1,1).setValues(value); 
} 

시각화 : CLICK TO SEE GIF

+0

가능한 복제 [당신이 응용 프로그램 스크립트를 사용하여 구글 스프레드 시트의 셀 내부 UI를 추가하려면 어떻게?] (https://stackoverflow.com/questions/6876819/how-do-you-add-ui-inside -cells-in-a-google-spreadsheet-using-app-script) –

+0

버튼으로 실행할 수 없다는 것은 무엇을 의미합니까? 너 뭐 해봤 니? 오류 메시지가 나타 났습니까? –

+0

안녕하세요, 내 게시물을 업데이트했습니다 – Stz

답변

0

"Plus"google apps 스크립트 포럼의 Edward Ulle에게 큰 감사드립니다.

우리는 자동으로 OnEdit 작업을하는 게시물에서 제공했던 것과 동일한 스크립트의 작업 버전을 만들었습니다.

다음 스크립트는 Col16에서 Sheet1 col4에 "예"가 포함되어 있으면 Sheet2 Col4의 셀을 복사합니다. 모든 것은 선택 사항입니다.

function copymissings() { 
    try { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    // Source sheet 
    var shs = ss.getSheetByName("2"); 
    // Values from Sheet2 
    var vs = shs.getRange(1,1,shs.getLastRow(),shs.getLastColumn()).getValues(); 
    // Destination sheet 
    var shd = ss.getSheetByName("1"); 
    // Get the destination range 
    var rd = shd.getRange("D:D"); 
    // Gets a 2D array 
    var vd = rd.getValues(); 
    var j = 1; 
    // Get offset j to first empty row 
    for(j=0; j<vd.length; j++) { 
     if(vd[j][0] == 0) break; 
    } 
    // Assuming you want to do for every row in Sheet2 
    for(var i=0; i<vs.length; i++) { 
     if(vs[i][15] == "Yes") { // Column 16 is index 15 
     // Use offset from last row of destination sheet 
     rd.offset(j,0,1,1).setValue(vs[i][3]); // Copy to column 4 (0) 
     j++; // Increment to next row 
     } 
    } 
    } 
    catch(err) { 
    Logger.log(err); 
    } 
} 
0

두 가지 개념을 혼합한다고 생각합니다. onEdit()은 사용자가 셀 값을 변경하면 자동으로 실행되는 트리거입니다. 그러나 사용자가 이벤트가 트리거 될 때 담당하고 있으므로 수동으로 수행하려고합니다.

UI 버튼 생성 방법은 HTML Service: Create and Serve HTML을 참조하십시오. 실제 샘플 here을 확인할 수 있습니다.

+0

Sry하지만 내가 기대했던 것이 아닙니다. 의해 답변을 Ty – Stz

관련 문제