【问题标题】:Sheets Script to copy parts of a row based on Cell value表格脚本根据单元格值复制行的一部分
【发布时间】:2019-10-10 04:51:42
【问题描述】:

所以。这应该很简单而且我可以用 (=QUERY(MAIN!A:H, "select A,C,F where H='OPEN'") 做我需要的事情,但我无法排序或编辑。所以我正在尝试制作一个脚本,从“MAIN”选项卡复制到“OPEN”选项卡,当 H 列更改为 OPEN 时,仅列 A、C 或 F。我需要将它放在触发器上,以便信息保持在打开的选项卡上我可以对其进行编辑和排序。问题是。我不擅长脚本,我无法弄清楚如何只处理 A、C 和 F 列。到目前为止。

https://docs.google.com/spreadsheets/d/11PfKqDhQnBkDM9qIw3CjVUa9-fOTTVg51TzWzHXUo5w/edit?usp=sharing

  function CopyDataToNewFile() {
var sourceSheet = SpreadsheetApp.openById('11PfKqDhQnBkDM9qIw3CjVUa9-fOTTVg51TzWzHXUo5w').getSheetByName('MAIN'),
    sourceValues = sourceSheet.getRange(4, 1, sourceSheet.getLastRow(), sourceSheet.getLastColumn()).getValues(),
    targetSheet = SpreadsheetApp.openById('11PfKqDhQnBkDM9qIw3CjVUa9-fOTTVg51TzWzHXUo5w').getSheetByName('OPEN');
targetSheet.getRange(targetSheet.getLastRow() + 1, 1, sourceValues.length, sourceValues[0].length).setValues(sourceValues);
sourceSheet.getRange(6, 1, sourceSheet.getLastRow(), sourceSheet.getLastColumn())

}

【问题讨论】:

  • 您介意分享一份经过编辑的工作表吗?尝试了解工作表的数据模式(即,如果它只有 1 行或多行将在那里添加等等)。
  • 脚本是否绑定到电子表格?

标签: google-apps-script google-sheets spreadsheet google-sheets-api google-sheets-formula


【解决方案1】:

编辑:

如果您不希望脚本在编辑 MAIN 的 Status 列时自动运行,请改用此函数:

function CopyDataToNewFile() {
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MAIN');
  var values = sourceSheet.getDataRange().getValues();
  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('OPEN');
  targetSheet.clear();
  for(var i = 1; i < values.length; i++) {
    if(values[i][7] == 'OPEN') {
      var dataA = values[i][0];
      var dataC = values[i][2];
      var dataF = values[i][5];
      targetSheet.appendRow([dataA, dataC, dataF]);    
    }
  }
}

===========================================

如果您希望脚本在每次编辑 H 列时运行,请在下面使用。如果编辑的单元格来自 MAIN 的 H 列,则脚本不会执行任何操作,因此不必担心 OPEN 中的编辑会更改 MAIN 中的数据。

所有数据都复制到“打开”选项卡的前 3 列。此外,在复制之前,OPEN 选项卡中的所有先前数据都会被删除:

function onEdit(e) {
  var sourceSheet = e.source.getActiveSheet();
  var sheet_name = sourceSheet.getName();
  var column = e.range.getColumn();
  if(sheet_name == 'MAIN' && column == 8) {
    var values = sourceSheet.getDataRange().getValues();
    CopyDataToNewFile(values);
  }
}

function CopyDataToNewFile(values) {
  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('OPEN');
  targetSheet.clear(); // This clears previous data in OPEN tab, delete this line if you don't want this to happen.
  // Looping through each row in MAIN tab
  for(var i = 1; i < values.length; i++) {
    // Checking if column H value is 'OPEN'
    if(values[i][7] == 'OPEN') {
      // Getting values from A, C, F columns
      var dataA = values[i][0];
      var dataC = values[i][2];
      var dataF = values[i][5];
      targetSheet.appendRow([dataA, dataC, dataF]);    
    }
  }
}

我希望这是你想要做的,如果我误解了你的目的,我很抱歉。

【讨论】:

  • 我收到第 15 行错误(for(var i = 1; i
  • 第 15 行有什么错误?也许您正在尝试直接运行 CopyDataToNewFile 并且脚本无法识别变量“值”?如果您只是希望它在需要时运行,您只需更改第一个函数的名称,使其不是 onEdit 触发器。另外,我不明白您所说的“我需要编辑并进行自定义,如果脚本正在编辑,这将被更改”。您要编辑的是什么?为什么你不能这样做?
  • 好的,你的脚本有效。它可以满足我的需要。但我确实需要把它放在触发器上。原因是我们使用这个开放列表为员工提供他们可以选择的选择。因此,我将其设置为保存提供给不同员工的列表。如果编辑时列表发生变化,则主列表将发生变化,而保存的列表将发生变化,因为它们相互补充。所以我需要能够仅在需要时对列表进行排序。
  • 您确定要在触发器中使用它吗?它已经在一个触发器中,一个 onEdit 触发器。实际上,从您的话中,我了解到您只是希望您的函数在手动运行时运行。所以不应该有 onEdit 触发器。另外,OPEN 选项卡如何修改 MAIN 选项卡? onEdit 检查编辑的单元格是否来自 MAIN 选项卡中的 H 列,如果不是,则不执行任何操作,因此 OPEN 中的编辑不会更改 MAIN 中的任何内容。
  • 我已经编辑了我的答案,以便脚本仅在您需要时运行。告诉我这是否适合您。
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多