2017-12-14 13 views
0

Google 스프레드 시트에 하루에 하나의 열로 설정된 모델이 있습니다. 실제와 예측을 모두 포함하며, 매일 예측을 실제와 바꾸기 위해 수식을 롤 포워드해야합니다. 나는 전체 열을 앞으로 굴릴 수는 없으며, 그 중 단지 한 부분 만 (위와 아래의 참조 번호는 변경되어서는 안됨).Google Apps Script : 수식을 기반으로 붙여 넣기 범위를 복사하는 방법은 무엇인가요?

매일이 작업을 수행하는 스크립트를 작성하려고했지만 getRange 동적 범위를 참조하는 방법을 모르겠습니다.

function rollColumn() { 
    var ss2 = SpreadsheetApp.openById('<ID redacted>'); 
    ss2.getRange("=index(Model!$7:$7,,match(today()-2,Model!$4:$4,0)):index(Model!$168:$168,,match(today()-2,Model!$4:$4,0))").copyTo(ss2.getRange("=index(Model!$7:$7,,match(today()-1,Model!$4:$4,0)):index(Model!$168:$168,,match(today()-1,Model!$4:$4,0))")) 
}; 

가 관련 범위를 기준으로 INDEX 공식은 한, 일 (필자는 스프레드 시트를 테스트 한) : 이것은 내 시도이다. 그러나 명확하게 getRange은 수식을 입력으로 허용하지 않습니다. 또한 Google 스프레드 시트에서는 수식을 사용하여 명명 된 범위를 만들 수 없습니다 (Excel에서이 문제를 해결하는 방법).

누군가가 GAS로이 기능을 재현하는 데 도움을 줄 수 있습니까?

이 내가 스택 오버플로에서 발견 한 가장 가까운 기존의 질문,하지만 난 그것이 작동되도록 할 수 없었던 : Google Apps Script performing Index & Match function between two separate Google Sheets

감사합니다!

+0

그것은 당신이 로그를 사용하여 시도 여부에 자바 스크립트를 알고 만있는 경우 명확하지 않다. 현재 코드의 주된 문제는 스크립트에서 Google 스프레드 시트 수식을 사용하려고하는 것입니다. 그러나 Google 스프레드 시트 공식은 Google 스프레드 시트에서만 작성됩니다. 색인과 일치하는 샘플 Google 시트 링크를 보내주십시오. 그런 다음 그 행동을 복제하는 코드를 제공하고 도움을 제공 할 것입니다. –

+0

빠른 답장을 보내 주신 앙투안 (Antoine)에게 감사드립니다. 다음은 간단한 샘플 시트입니다. https://docs.google.com/spreadsheets/d/1BU2rhAZGOLYgzgSAdEz4fJkxEcPRpwl_TZ1SR5F0y08/edit?usp=sharing 요점은 전날 데이터가 오면이 경우 복사해야한다는 것입니다. 'M4 : M6'을'N4 : N6'으로 바꾼다 나는 오늘의 날짜를 기준으로 그 범위에 어떻게 도달 할 것인가를 보여주는 노란색의 수식을 포함 시켰지만, 스크립트 해결책이 완전히 달라질 수 있다고 확신한다. 고마워. 고마워. 다시! –

+0

링크를 제공해 주셔서 감사하지만 수식을 볼 수 없습니다. 공유 설정을 [웹상에서 공개] (https://support.google.com/drive/answer/2494822?co=GENIE.Platform%3DDesktop&hl=ko)로 변경할 수 있습니까? 당신의 질문을 보는 모든 사람들이 그것을 볼 수 있도록? –

답변

0

코드에 {contentsOnly : false} 매개 변수를 추가해야합니다. 이런 일이 :

TemplateSheet.getRange("S2:T2").copyTo(DestSheet.getRange("S2:T"+LRow2+""), {contentsOnly:false}); 
0

는 오른쪽에있는 행에 수식을 붙여, 칼럼의 제목에서 날짜를 얻기 :

// note: we assume that sheet is disposed as in the following document: https://docs.google.com/spreadsheets/d/1BU2rhAZGOLYgzgSAdEz4fJkxEcPRpwl_TZ1SR5F0y08/edit?ts=5a32fcc5#gid=0 
function find_3formulas() { 

    var sheet = SpreadsheetApp.getActiveSheet(), 
     leftTitle, // this variable will stay unused because we do not need a vertical index 
     topTitle = todayMinus_xDays(2), 
     topTitlesRange = sheet.getRange("G3:T3"), 
     leftTitlesRange = sheet.getRange("A4:A8"); // this range will stay unused. 

    var coor = findCoordinates(leftTitlesRange, leftTitle, topTitlesRange, topTitle); 

    if (coor.row == null || coor.column == null) { 
    sheet.getRange("M12:M14").setFormula('="NULL: please check logs"'); 
    return; 
    } 

    var rowAxis = 4 + coor.row; 
    var colAxis = 8 + coor.column; 
    var fromRange = sheet.getRange(rowAxis, colAxis, 3, 1); 
    var toRange = sheet.getRange(rowAxis, colAxis + 1, 3, 1); 

    Logger.log(fromRange.getA1Notation()) 
    Logger.log(toRange.getA1Notation()); 

    var threeFormulas = fromRange.getFormulas(); 

    toRange.setFormulas(threeFormulas) 
} 

// unused in current script! 
function findCoordinates(leftTitlesRange, leftTitle, topTitlesRange, topTitle) { 

    var formattedDate, 
     row = 0, 
     column = 0; 

    if (leftTitle) { 
    row = findRow(leftTitlesRange, leftTitle); 
    } 

    if (topTitle) { 
    column = findColumn(topTitlesRange, topTitle); 
    } 

    var array = {row:row, column:column} 

    return array; 
} 

// unused in current script! 
function findRow(range, valueToSearch) { 

    var colRows = range.getValues(); 
    for (i = 0; i < colRows.length; i++) { 
    if (valueToSearch == colRows[i][0]) {return i;} 
    } 
    // however, if found nothing: 
    Logger.log("the value " + valueToSearch + " could not be found in row titles"); 
    return null; 
} 

// assumes that column titles are dates, therefore of type object. 
function findColumn(range, valueToSearch) { 

    var colTitles = range.getValues(); 
    for (i = 0; i < colTitles[0].length; i++) { 
    if (typeof colTitles[0][i] == "object") { 
     formattedDate = Utilities.formatDate(colTitles[0][i], "GMT", "yyyy-MM-dd") 
    }; 
    if (valueToSearch === formattedDate) {return i;} 
    } 
    // however, if found nothing: 
    Logger.log("today's date, " + valueToSearch + ", could not be found in column titles"); 
    return null; 
} 

// substracts 2 days from today, then returns the result in string format. 
function todayMinus_xDays(x) { 
    var d = new Date(); 
    d = new Date(d - x * 24 * 60 * 60 * 1000); 
    d = Utilities.formatDate(d, "GMT", "yyyy-MM-dd"); 
    return d; 
} 
+0

도움을 주셔서 대단히 감사합니다! 불행히도이 스크립트는 값보다는 수식을 붙여 넣어야하므로 염두에 두었던 것이 아니라고 생각합니다. 다시 작성하는 방법을 100 % 확신 할 수는 없습니다. 자연어로 말하자면, 스크립트가 필요한 것은 다음과 같습니다 : a) $ 4 : $ 8 범위 내에서 오늘 일자에서 2 일을 제외하고 ($ 3 : $ 3 사용) 일치하는 열을 찾습니다. b) 수식 및 서식을 유지하면서이 범위 (현재 N4 : N8)를 (O4 : O8)을 따라 한 열로 복사합니다. 쉽게 해결할 수 있습니까? –

+0

이제 코드가 모든 작업을 수행합니다. 그것이 효과가 있는지 알려주세요. –