在单一的Google工作表中,我有一个用户输入表,它可以很好地为不喜欢电子表格的人工作,因此标签上有数据,还有一个用于记录的分类账。输入表包含以用户为中心的计算单元和以记录为重点的单元组合。我正在尝试创建一个脚本(将从工作表上的一个按钮运行,该脚本已经工作),该脚本将以记录为焦点的单元格的当前内容复制到分类账表中,然后重新设置所有输入单元格以供下次使用。我需要脚本来处理输入表的多个副本,我希望它在使用时不会明显跳到记录表上,但这是可选的。
到目前为止,我已经拼凑了我的脚本,而不是宏记录和许多其他的答案;我没有执着于当前的任何代码,但是输入和输出表需要保持原样。不过,我确实有一个计算内脏表,可以用来保存当前代码中的一些常量值。我已经看到了一些类似问题的解决方案,这些解决方案需要定义哪些单元格可以从电子表格中复制/复制到电子表格本身,但我并不太担心。
编辑:好的,我把代码清理得很干净,现在它做了我需要的,只是效率很低。
function MakeMasterLogRecord() {
var spreadsheet = SpreadsheetApp.getActive();
var sourcesheet = SpreadsheetApp.getActiveSheet();
const masterlog = spreadsheet.getSheetByName('Master Log');
var firstemptyrow = masterlog.getLastRow() + 1;
var currentcolumn = 1
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
var sourcecells = ['Z12','C2','N2','C10','F2','C4','E4','C5','E5','L5','L4','Z13','T4','T5','C6'];
sourcesheet.getRange('Z12').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('N2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C10').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('F2').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('E4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('E5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('L5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('L4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('Z13').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('T4').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('T5').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
sourcesheet.getRange('C6').copyTo(targetcell, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
currentcolumn++;
};
变量"sourcecells“是包含我想要复制的信息的单元格列表,我希望能够使用它作为循环的输入,而不是直接调用列表中的每个值。目前没有使用它。
再次编辑:
使用Kessy建议的getValue和setValue,库珀建议的forEach循环。
这个“工作”是因为它运行正确的次数,尽管使用相同的数据,而且比我刚才手动列出单元格引用的版本要慢得多。
function MakeMasterLogRecord() {
var spreadsheet = SpreadsheetApp.getActive();
var sourcesheet = SpreadsheetApp.getActiveSheet();
const masterlog = spreadsheet.getSheetByName('Master Log');
var firstemptyrow = masterlog.getLastRow() + 1;
var currentcolumn = 1
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
const sourcecell = ['\'Z12\'','\'C2\'','\'N2\'','\'C10\'','\'F2\'','\'C4\'','\'E4\'','\'C5\'','\'E5\'','\'L5\'','\'L4\'','\'Z13\'','\'T4\'','\'T5\'','\'C6\''];
for (const element of sourcecell) {
var targetcell = masterlog.getRange(firstemptyrow, currentcolumn, 1, 1);
targetcell.setValue(sourcesheet.getRange('Z12').getValue());
currentcolumn++;
};
};
我已经尝试过带有和不带转义引号的数组条目,但这两种方法都会导致范围没有找到错误。我无法让转义引号在"sourcecell“变量周围正常工作,所以我不知道如果我这样做,它是否会起作用。它总是把"sourcecell“这个词放在引号里。
发布于 2022-04-28 06:18:40
尝试这样做可以提高一些性能:
function submitData() {
const ss = SpreadsheetApp.getActive();
const formRangeList = ss.getActiveSheet()
.getRangeList(['Z12', 'C2', 'N2', 'C10', 'F2', 'C4', 'E4', 'C5', 'E5', 'L5', 'L4', 'Z13', 'T4', 'T5', 'C6']);
ss.getSheetByName('Master Log')
.appendRow(formRangeList.getRanges().map(range => range.getValue()));
formRangeList.clearContent(); // remove this line if you do not want to clear the "form"
}
这仍然远远不是最优的,因为它调用Range.getValue()
15次。要提高运行时性能十倍,请使用.getRange('A1:Z13').getValues()
一次获取所有数据,然后使用数组索引提取所需的值并追加到目标表中,如下所示:
function submitDataOhSoMuchFaster() {
const ss = SpreadsheetApp.getActive();
const values = ss.getActiveSheet().getRange('A1:Z13').getValues();
const spec = [
{ column: 26, row: 12 }, // Z12
{ column: 3, row: 2 }, // C2
{ column: 14, row: 2 }, // N2
// ...
];
ss.getSheetByName('Master Log')
.appendRow(spec.map(cell => values[cell.row - 1][cell.column - 1]));
}
https://stackoverflow.com/questions/72014024
复制相似问题