在 Google 张中复制和粘贴移动极差
Copy and Pasting a Moving Range in Google Sheets
我仍在学习脚本编写的基础知识,但我有一个相当具体的问题,我一直无法找到解决方案 - 可能是因为我可能措辞错误。
本质上,在 sheet MS
中,我有一系列数据 (A2:O23
),其中包含我希望保持固定的公式(例如,始终引用相同的范围一个不同的 sheet).
我的目标是,在脚本的 运行 处,这个公式块将从下一个空行(在相同的列 [A:O
] 中)复制并粘贴,并且前一个块 (A2:O23
) 将复制并粘贴自身作为值。
然后,每次脚本 运行s,它都会做同样的事情,将最新的 22 行块复制到其下方并将其自身粘贴为值。本质上具有构建一长串数据的效果,其中最新(读取最低)范围是公式,以上都是值。
例如,第一次 运行 的结果应该是 A24:O45
现在显示相同的公式,而 A2:O23
仅显示为值。下一次,A24:O45
将被冻结为值,A46:O67
现在是公式。
我不确定这是否需要使用循环或有不同的方法来实现效果,但前者是我没有使用过的东西,后者对我来说仍然是个谜。
我知道这可能不是特别清楚,但我很乐意回答任何问题,并非常感谢为提供帮助所做的任何努力。
谢谢
function copypastepaste() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rows=sh.getLastRow();
if(rows>22) {
var rg=sh.getRange(sh.getLastRow()-21,1,22,16);
var vA=rg.getDisplayValues();
var fA=rg.getFormulas();
var nrg=sh.getRange(sh.getLastRow()+1,1,22,16);
nrg.setFormulas(fA);
rg.setValues(vA);
}
}
如果我理解正确的话,你想要:
- 将 sheet 的最后 22 行(第
A
至 O
列)复制到接下来的 22 行(包括公式)。
- Copy/paste 到原始范围仅作为值。
如果以上是正确的,那么您可以将以下代码复制并运行到绑定到您的传播的脚本中sheet(请参阅内联注释以了解代码正在做什么的详细信息,步骤逐步):
function copyPasteValues() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("MS"); // Name of your sheet (change if that's necessary)
var lastRow = sheet.getLastRow();
var firstCol = 1; // First column to copy
var numCols = 15; // Number of columns to copy
var numRows = 22; // Number of rows to copy
if (lastRow > numRows) { // Check if the sheet has at least 23 rows with content (otherwise it would give error when copying the range)
var originRange = sheet.getRange(lastRow - numRows + 1, firstCol, numRows, numCols);
var destRange = sheet.getRange(lastRow + 1, firstCol, numRows, numCols);
originRange.copyTo(destRange); // Copying with formulas to next 22 rows
originRange.copyTo(originRange, {contentsOnly:true}); // Copying only values to same range
}
}
这里主要注意的方法是copyTo
,可以原样复制数据,with formulas included, or values only, by setting the parameter {contentsOnly:true}
(copyValuesToRange也可以。
希望对您有所帮助。
我仍在学习脚本编写的基础知识,但我有一个相当具体的问题,我一直无法找到解决方案 - 可能是因为我可能措辞错误。
本质上,在 sheet MS
中,我有一系列数据 (A2:O23
),其中包含我希望保持固定的公式(例如,始终引用相同的范围一个不同的 sheet).
我的目标是,在脚本的 运行 处,这个公式块将从下一个空行(在相同的列 [A:O
] 中)复制并粘贴,并且前一个块 (A2:O23
) 将复制并粘贴自身作为值。
然后,每次脚本 运行s,它都会做同样的事情,将最新的 22 行块复制到其下方并将其自身粘贴为值。本质上具有构建一长串数据的效果,其中最新(读取最低)范围是公式,以上都是值。
例如,第一次 运行 的结果应该是 A24:O45
现在显示相同的公式,而 A2:O23
仅显示为值。下一次,A24:O45
将被冻结为值,A46:O67
现在是公式。
我不确定这是否需要使用循环或有不同的方法来实现效果,但前者是我没有使用过的东西,后者对我来说仍然是个谜。
我知道这可能不是特别清楚,但我很乐意回答任何问题,并非常感谢为提供帮助所做的任何努力。
谢谢
function copypastepaste() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rows=sh.getLastRow();
if(rows>22) {
var rg=sh.getRange(sh.getLastRow()-21,1,22,16);
var vA=rg.getDisplayValues();
var fA=rg.getFormulas();
var nrg=sh.getRange(sh.getLastRow()+1,1,22,16);
nrg.setFormulas(fA);
rg.setValues(vA);
}
}
如果我理解正确的话,你想要:
- 将 sheet 的最后 22 行(第
A
至O
列)复制到接下来的 22 行(包括公式)。 - Copy/paste 到原始范围仅作为值。
如果以上是正确的,那么您可以将以下代码复制并运行到绑定到您的传播的脚本中sheet(请参阅内联注释以了解代码正在做什么的详细信息,步骤逐步):
function copyPasteValues() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("MS"); // Name of your sheet (change if that's necessary)
var lastRow = sheet.getLastRow();
var firstCol = 1; // First column to copy
var numCols = 15; // Number of columns to copy
var numRows = 22; // Number of rows to copy
if (lastRow > numRows) { // Check if the sheet has at least 23 rows with content (otherwise it would give error when copying the range)
var originRange = sheet.getRange(lastRow - numRows + 1, firstCol, numRows, numCols);
var destRange = sheet.getRange(lastRow + 1, firstCol, numRows, numCols);
originRange.copyTo(destRange); // Copying with formulas to next 22 rows
originRange.copyTo(originRange, {contentsOnly:true}); // Copying only values to same range
}
}
这里主要注意的方法是copyTo
,可以原样复制数据,with formulas included, or values only, by setting the parameter {contentsOnly:true}
(copyValuesToRange也可以。
希望对您有所帮助。