首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google脚本-试图有效地将非连续单元从一个工作表复制到另一个工作表的第一个空行

Google脚本-试图有效地将非连续单元从一个工作表复制到另一个工作表的第一个空行
EN

Stack Overflow用户
提问于 2022-04-26 12:31:49
回答 1查看 83关注 0票数 0

在单一的Google工作表中,我有一个用户输入表,它可以很好地为不喜欢电子表格的人工作,因此标签上有数据,还有一个用于记录的分类账。输入表包含以用户为中心的计算单元和以记录为重点的单元组合。我正在尝试创建一个脚本(将从工作表上的一个按钮运行,该脚本已经工作),该脚本将以记录为焦点的单元格的当前内容复制到分类账表中,然后重新设置所有输入单元格以供下次使用。我需要脚本来处理输入表的多个副本,我希望它在使用时不会明显跳到记录表上,但这是可选的。

到目前为止,我已经拼凑了我的脚本,而不是宏记录和许多其他的答案;我没有执着于当前的任何代码,但是输入和输出表需要保持原样。不过,我确实有一个计算内脏表,可以用来保存当前代码中的一些常量值。我已经看到了一些类似问题的解决方案,这些解决方案需要定义哪些单元格可以从电子表格中复制/复制到电子表格本身,但我并不太担心。

编辑:好的,我把代码清理得很干净,现在它做了我需要的,只是效率很低。

代码语言:javascript
运行
复制
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循环。

这个“工作”是因为它运行正确的次数,尽管使用相同的数据,而且比我刚才手动列出单元格引用的版本要慢得多。

代码语言:javascript
运行
复制
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“这个词放在引号里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 06:18:40

尝试这样做可以提高一些性能:

代码语言:javascript
运行
复制
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()一次获取所有数据,然后使用数组索引提取所需的值并追加到目标表中,如下所示:

代码语言:javascript
运行
复制
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]));
}

应用程序脚本最佳实践

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72014024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档