【问题标题】:How optimize code to copy one sheet range to another sheet range如何优化代码以将一个工作表范围复制到另一个工作表范围
【发布时间】:2019-10-07 07:59:25
【问题描述】:

我下面的代码有效,但我认为有一种更优雅的方法。我想将客户表(源)上选定行 (D:R) 的一部分复制到测试表(目标)到该表中的第一个空白行 (C:Q)。

代码有效,但看起来性能不佳/不优雅。

function rowSelected() {  
  var customer_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Customer_Info");
  var invoice_sheet =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
  var customer_selection_row = customer_sheet.getActiveRange().getRow();
  //Browser.msgBox(customer_selection_row);

  var customer_selection_start = 'D' + customer_selection_row;
  var customer_selection_end = 'R' + customer_selection_row;
  var customer_selection_range = customer_selection_start + ':' + customer_selection_end;
  var source_range = customer_sheet.getRange(customer_selection_range);
  customer_sheet.setActiveRange(source_range);
  //Browser.msgBox(source_range.getA1Notation());

  var invoice_selection_row = getFirstEmptyRowWholeRow();
  var invoice_selection_start = 'C' + invoice_selection_row;
  var invoice_selection_end = 'Q' + invoice_selection_row;
  var invoice_selection_range = invoice_selection_start + ':' + invoice_selection_end;
  var destination_range = invoice_sheet.getRange(invoice_selection_range);
  invoice_sheet.setActiveRange(destination_range);
  //Browser.msgBox(destination_range.getA1Notation());

  customer_sheet.setActiveRange(source_range).copyTo((destination_range), {contentsOnly:true});
}

我在想有什么方法可以用更少的代码做到这一点。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:
    • 您希望将工作表Customer_Info 的活动范围行的“D”列“R”复制到工作表getFirstEmptyRowWholeRow() 检索到的行的“C”列“Q” Test
    • 您想激活源范围。

    如果我的理解是正确的,那么这个修改呢?

    修改点:

    • SpreadsheetApp.getActiveSpreadsheet() 被声明为 `ss` 一次。
    • 使用getRange(row, column, numRows, numColumns) 代替getRange(a1Notation)
    • 关于destination_range,设置起始单元格后,可以从中复制源范围。
    • 当活动工作表为Customer_Info 时,脚本运行。

    修改脚本:

    function rowSelected() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var customer_sheet = ss.getActiveSheet();
      if (customer_sheet.getSheetName() == "Customer_Info") {
        var invoice_sheet = ss.getSheetByName("Test");
        var activeRange = ss.getActiveRange();
        var source_range = customer_sheet.getRange(activeRange.getRow(), 4, activeRange.getNumRows(), 15).activate();
        var destination_range = invoice_sheet.getRange(getFirstEmptyRowWholeRow(), 3); // or invoice_sheet.getRange("C" + getFirstEmptyRowWholeRow())
        source_range.copyTo(destination_range, {contentsOnly: true});
      }
    }
    
    • getFirstEmptyRowWholeRow() 您的脚本也用于上述修改后的脚本。
    • 在此修改后的脚本中,如果要在工作表Customer_Info 上选择“A1:A3”的范围并运行脚本,则从“列”的单元格中复制单元格“D1:R3”的值C"和getFirstEmptyRowWholeRow()的行。

    参考资料:

    如果我误解了您的问题并且这不是您想要的,我深表歉意。

    【讨论】:

    • 感谢您的输入,我会测试一下。
    • @Alan W. 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多