我正试图从工作表'Full'复制一个范围,并将值仅粘贴到新工作表'Dump'。虽然下面的宏只执行一次操作,但我要重新生成原始数据范围(Full),因此我希望复制该新集并将其附加到相同的输出页面,向下索引到空白行,并保留第一个粘贴的数据。然后再做100次。重新编码的宏如下,我需要理解要添加到;
中的脚本。- 复制/粘贴100次,
- 将粘贴范围偏移一组行数。
对不起,真正的新手在编辑谷歌工作表宏。我使用的Excel宏不翻译。谢谢你的回答。
function xmacro() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A1').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Full'), true);
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Dump'), true);
spreadsheet.getRange('Full!BK3:BT34').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);```
};
你的宏只是一个自动生成的应用程序脚本。您可以通过使用更多代码在此基础上进行构建来扩展其功能。首先,我将解释一些基本概念,如果你知道这些,那么就直接跳到代码。
<<p>表概念/strong>这里有一些基本概念,我花了很长时间才弄清楚,因为大多数文档都假设你已经精通Javascript。
一个范围是一个二维数组,每一行有一个数组,数组的内容是列:
someRange = [
[row1Col1, row1Col2, row1Col3, row1Col4],
[row2Col1, row2Col2, row2Col3, row2Col4],
[row3Col1, row3Col2, row3Col3, row3Col4]
]
要访问特定的值,您需要引用行数组,然后引用所需列的索引。把它想象成酒店房间号。数字的第一部分是地板,第二部分是该楼层的特定房间。
通过调用数组名称,然后用方括号加上所需元素的索引号来访问数组。
数组从0开始索引,因此要获得第1行,您可以使用:
someRange[0] would return the inner array [row1Col1, row1Col2, row1Col3]
.
但这并没有给你一个特定的单元格值-所以你会使用第二组括号来访问该行中的列:someRange[0][1] = 'row1Col2'
数组也有内置的信息,因此您可以使用array来查找数组的长度。长度无括号
由于行在外部数组中,您可以通过查看有多少个内部数组来获得行数。
someRange.length = 3
someRange数组中有3行数组
您可以对列执行相同的操作,因为列的数量等于数组中的元素数量。要获取第一行的元素数,可以使用:
someRange[0].length - which would be 4
因为一个范围每行有相同的列数,你可以选择任意一行要获取列数(通常,总是有例外)
第一个函数将创建一个自定义菜单项来运行代码。
// create a new menu item for your custom function
function onOpen(){
SpreadsheetApp.getUi().createMenu()
.addItem('100 Copies', 'lotsOfCopies')
.addToUi();
}
function lotsOfCopies() {
var ss = SpreadsheetApp.getActive();
var copySheet = ss.getSheetByName('yourCopySheetName');
var pasteSheet = ss.getSheetByName('yourPasteSheetName');
// the range you wish to copy, change to fit your needs
var copyRange = copySheet.getRange('A1:B7');
var copyValues = copyRange.getValues();
var copyRows = copyValues.length;
var copyCols = copyValues[0].length;
// define the first row to be pasted into
var pasteRow = 1;
// define the left side column of the range to be pasted into
var pasteCol = 1
// build a loop that does the same thing 100 times,
// and each time offsets the paste range by the number of rows in the copy range
for (var i = 0; i < 100; i++) {
// for every iteration after the first,
// add the number of rows in the copy range to the variable 'row'
// example if there are 10 rows in the copy range then
// iteration 1 row = 1 Iterartion 2 row = 11, Iteration 3 row = 21
if (i > 0) {
pasteRow = +pasteRow + +copyRows
}
// build the range to paste into - it starts on pasteRow and paste col,
// and is as many rows as the copied range, and as many columns as the copied range
let pasteRange = pasteSheet.getRange(pasteRow, pasteCol, copyRows, copyCols);
// put the values from copyValues into the pasteRange
pasteRange.setValues(copyValues);
}
}
function xmacro() {
const ss = SpreadsheetApp.getActive();
const ssh = ss.getSheetByName('Full')
const dsh = ss.getSheetByName('Dump')
ssh.getRange('BK3:BT34').copyTo(dsh.getRange('A1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
}