2017-12-14 14 views
0

私は1日1列で設定されたモデルを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

それはあなたがログを使用して試してみましたかあなたはJavaScriptを知っているだけの場合は不明です。現在、コードの主な問題は、スクリプトでGoogleスプレッドシートの数式を使用しようとしていることです。ただし、GoogleスプレッドシートはGoogleスプレッドシートでのみ作成できます。インデックスに一致するサンプルのGoogleシートへのリンクを送信してください。それから、その振る舞いを再現するコードを提供します。 –

+0

あなたの素早い返信のためにアントワーヌありがとうございます。ここには簡単なサンプルシートがあります: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=ja)に変更できますか?あなたの質問を見る人は誰でもそれを見ることができるのですか? –

答えて

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

ありがとうございました!残念ながら、このスクリプトは、値ではなく数式を貼り付ける必要があるので、私が気にしていたことはまったく思いつかないと思います。自然言語の言葉では、私はスクリプトを実行する必要があります: a)領域$ 4:$ 8内で、今日の日付から2日を引いた列が($ 3:$ 3を使用して)検索されます。 b)この範囲(現在のN4:N8)を(O4:O8)に沿って1つの列にコピーし、数式と書式を保存します。 これは簡単な修正ですか? –

+0

これですべてのコードがコードを実行します。それがあなたのために働くかどうか私に知らせてください –

関連する問題