【问题标题】:Script to Copy cells to another sheet, for example, based on the Background Color of the Cell将单元格复制到另一个工作表的脚本,例如,基于单元格的背景颜色
【发布时间】:2022-01-28 03:16:53
【问题描述】:

首先,我对 Google 表格和脚本完全陌生,所以我正在努力自学,如果我问的是“愚蠢”的问题,请见谅

所以我的问题是:我创建了一个脚本,基本上根据特定条件向单元格添加背景颜色。我现在想要做的是识别所有添加了背景颜色的单元格,选择包含它们的整行并将所有信息复制到另一个工作表。

我试图用 if 条件来做,但我不知道如何选择整行,或者我用来获取背景颜色的条件是否正确。有谁能够帮我?非常感谢!

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Sheet1');
  var r = s.getRange('F:F');
  var v = r.getBackgrounds();
  for(var i=v.length-1;i>=0;i--)
    if(v =='B7E1CD')
      s.getCurrentCell.copyTo(spreadsheet.getRange(20,1)); //don't mind this instruction, I know it isn't right

【问题讨论】:

  • 定义spreadsheet。它是同一电子表格文件的工作表还是不同电子表格文件的工作表?
  • 尝试使用 v[i][0]=='#B7E1CD' 如果要使用这种范围定义作为替代方法,还需要使用过滤器方法您可以使用使用获取最后一行方法的范围定义
  • 请记住,当您使用获取值或获取背景时,您总是会得到二维光线返回给您,即使它只是单列或单行。我意识到这并不直观,但这是现实
  • 嗨@Mario!它是同一个电子表格文件中的一张工作表。抱歉,如果不清楚

标签: google-apps-script google-sheets


【解决方案1】:

解释:

您的目标是仅filter F 列中背景颜色为'#b7e1cd' 的行,并将这些值复制到不同的工作表中。

  • 你不需要循环来实现这个目标,你可以直接过滤F中背景颜色为'#b7e1cd'的行。

    const new_values = values.filter((_,i)=>colors[i]=='#b7e1cd');
    

    其中values 被定义为datarange 的完整Sheet1

    const values = sh.getDataRange().getValues();
    

如果您想在同一个电子表格文件中移动数据,可以使用copyTo。这就是为什么我更喜欢getRange/setValues,因为它没有这个限制。

解决方案:

以下脚本将从A1 的单元格Sheet2 开始粘贴值。如果您想要不同的起始单元格,请将target_sh.getRange(1,1,..) 中的1,1 修改为不同的单元格引用。

function myFunction() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1'); // put the name of the source sheet
  const target_sh = ss.getSheetByName('Sheet2'); // put the name of the target sheet
  const colors = sh.getRange('F1:F').getBackgrounds().flat();
  const values = sh.getDataRange().getValues();
  const new_values = values.filter((_,i)=>colors[i]=='#b7e1cd');
  target_sh.getRange(1,1,new_values.length,new_values[0].length).setValues(new_values);
}

根据您的工作表更新代码:

function iftest() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('HH 2 - Main Database'); // put the name of the source sheet
  const target_sh = ss.getSheetByName('HH 1 - New Database'); // put the name of the target sheet
  const colors = sh.getRange('F1:F').getBackgrounds().flat();
  console.log(colors);
  const values = sh.getDataRange().getValues();
  let LastRow = target_sh.getLastRow();
  const new_values = values.filter((_, i) => colors[i]=='#ff6d01');
  target_sh.getRange(LastRow+1,1,new_values.length,new_values[0].length).setValues(new_values);
}

【讨论】:

  • 非常感谢您的帮助!我只有一个问题,在 ``` const new_values = values.filter((,i)=>colors[i]=='#b7e1cd'); ``` (, i) 是什么意思?因为由于某种原因,脚本返回错误“无法读取未定义的属性'长度'”,我想问题出在变量 new_vales
  • @Filipa 你能分享一份你的工作表吗?恐怕 F 列不包含所需的颜色。删除所有敏感信息。
  • 有什么方法可以直接分享给你,或者你给我你的电子邮件,以便我将你添加到工作表中?只是这份文件不是我的,我不想公开分享它
  • @Filipa 创建一个模拟表示例,其中包含一些虚假数据。只是为了创建一个最小的可重现示例。并在这里分享这个例子。之后您可以删除链接
  • @Filipa 1) 创建一个名为 HH 1 - New Database 的目标表。 2)你的背景颜色(玛丽等的名字)不是B7E1CD而是#ff6d01。 3) 将我的答案中的更新代码复制到不同的脚本中,以确保您只运行iftest。该脚本将获取 F 列为橙色的行(第 10、12、13 行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2010-10-31
  • 2016-10-07
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多