将单元格复制到另一个工作表的脚本,例如,基于单元格的背景颜色

时间:2021-03-02 15:30:42

标签: google-apps-script google-sheets

首先,我对 Google Sheets 和 Scripts 完全陌生,所以我正在尝试自己学习,如果我问了一些“愚蠢”的问题,很抱歉

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

我试图用 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

1 个答案:

答案 0 :(得分:1)

说明:

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

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

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

    其中 values 定义为 Sheet1 的完整 datarange

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

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

解决方案:

以下脚本将从 A1 的单元格 Sheet2 开始粘贴值。如果您想要不同的起始单元格,请将 1,1 中的 target_sh.getRange(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);
}