如何基于列中的数据添加或删除行

时间:2018-06-19 23:36:41

标签: google-apps-script google-sheets

提前感谢您的帮助。

我遇到一个问题,即在Google Spreadsheet中动态字段旁边修改了静态字段。问题是有时带有动态数据的列会发生变化,而静态字段将不再适用于它们。

除了脚本外,我想不出一种处理方法,但是我的脚本知识充其量是有限的。

这个想法是要有一个使用= importrange()的工作表来容纳动态数据。然后,第二张工作表将具有静态数据,该数据将根据行是否与动态工作表匹配来添加或删除行。

例如:

动态工作表将被称为“源”,在第一列中,我们将使用以下名称:Peter,Brian,Louis,Chris,Stewie

静态工作表将称为“目标”,在第一列中,我们将使用以下名称:Peter,Brian,Louis,Chris,Meg

该想法是删除第一列中包含“ Meg”的行,然后插入“ Stewie”值(或在范围底部添加一行)。 最终目标是通过编程使静态列表与动态列表匹配。

1 个答案:

答案 0 :(得分:0)

将我认为应该进行的过程拼凑在一起之后,我就可以将其组合在一起。我有两个函数被第三个函数调用。第一个函数用于获取我需要的任何图纸的二维数组。这里的假设是我将要相互比较的数组都将在第一列中。

function grabSheetInformation(sheet) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetInfo = ss.getSheetByName(sheet);
  var range = sheetInfo.getRange("A2:A").getValues();
  var rangeMax = range.filter(String).length;

  range = sheetInfo.getRange("A2:A" + (rangeMax + 1)).getValues();


  return range;

}

我使用的第二个功能只是在说完所有内容后对数据进行排序。

function sortTargetData() {


  var sheetToSort = "Target"; // sheet name that is being sorted
  var columnToSortBy = 1; // column A = 1, B = 2, etc.
  var rangeToSort = "A2:R";
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToSort);
  var range = sheet.getRange(rangeToSort);
  range.sort( { column : columnToSortBy, ascending: true } );
    }

这是所有东西都融合在一起的地方。

function mergeData() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();



  var sourceInfo = grabSheetInformation("Source");
  var targetInfo = grabSheetInformation("Target");

  var sourceMax = sourceInfo.length;
  var targetMax = targetInfo.length;

  SpreadsheetApp.setActiveSheet(ss.getSheetByName("Target"));

  var sheet = ss.getActiveSheet();

  var array = [];
  var offset = 1;


  for (var i = 0; i < targetMax; i++) {

  array.push(targetInfo[i][0]);
  }


  for (i = 0; i < sourceMax; i++) {

    if(array.indexOf(sourceInfo[i][0]) == -1) {

      sheet.insertRowAfter(targetMax + offset);

      sheet.getRange("A" + (targetMax + offset + 1)).setValue(sourceInfo[i][0]);


      offset++;

      }

  }

  // reset variables

  sourceInfo = grabSheetInformation("Source");
  targetInfo = grabSheetInformation("Target");

  sourceMax = sourceInfo.length;
  targetMax = targetInfo.length;

  sheet = ss.getActiveSheet();

  array = [];


  for (i = 0; i < sourceMax; i++) {

  array.push(sourceInfo[i][0]);
  }

  for (i = targetMax -1; i >= 0; i--) {

    if(array.indexOf(targetInfo[i][0]) == -1) {


      sheet.deleteRow(i+2);

      }

  }

sortTargetData();

}

正如我在最初的问题中所述,该脚本的目的是允许用户拥有一个动态列表,以便他们可以向其中添加静态值。

电子表格的布局将具有两个选项卡,“源”和“目标”。 “源”选项卡的第一列中将包含动态数据,并带有标题。对于我的用例,将使用“ = importrange()”将其拉入。 “目标”标签的第一行将包含标题,并通过脚本进行更新。

如果“源”选项卡中的值不在“目标”选项卡中,则将在“目标”选项卡的列表末尾添加行,并添加缺少的值。

如果“目标”选项卡中的值不在“源”选项卡中,则将删除有问题的行。

我的组织有多个电子表格,各处都有员工姓名。这样做的好处是只有一个名称列表可以更新,而电子表格将使用最新列表自动更新。

还有一种假设是名称不会重复。

我创建的电子表格用于对此进行测试: Shared View Only Spreadsheet