【问题标题】:How to append new values from master Google sheet onto multiple sheet with conditions如何将主 Google 工作表中的新值附加到具有条件的多个工作表中
【发布时间】:2020-09-19 13:29:51
【问题描述】:

我有一个包含五列的主 Google 表格,每天自动更新。

Date    Event   Value1  Value2  Value3
May 1   ABC     A       Yes     Yes
May 1   ABC     B       Yes     Yes
May 1   ABC     C       Yes     Yes
May 1   DEF     A       Yes     Yes
May 1   DEF     B       Yes     Yes
May 1   GHI     A       Yes     Yes
May 1   GHI     C       Yes     Yes
May 2   ABC     A       Yes     Yes
May 2   DEF     D       Yes     Yes
May 2   GHI     C       Yes     Yes

同一个文档在 Master Sheet 中为三种类型的事件有一个对应的表:ABC、DEF 和 GHI。这些工作表中包含现有值。

我希望 Google Apps 脚本在编辑主表时仅将 Value1 中的唯一值和新值附加到相应的事件表中。示例:

工作表 ABC

Value
A
B
C

表 DEF

Value
A
B
D

表 GHI

Value
A
C

它并不真正取决于日期,而是查看相应工作表中已经存在的内容。

我是 Google Apps 脚本的初学者。我研究了其他解决方案,最远的一步是找到如何根据来自here 的事件值动态创建不同的工作表。

唯一的问题是这会复制所有行,这意味着我在其他工作表中会出现重复。

function createNewSheets() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var masterSheet = spreadsheet.getSheetByName('Raw');
  var data_range = masterSheet.getRange('B:C').getValues();
  // Get headers row (to be appended on top when new sheet is created):
  var headers = data_range[0];
  // Iterate through all rows of data from Raw:
  for (var i = 1; i < data_range.length; i++) {
    var row = data_range[i]; // Current row
    var eventName = row[0]; // Event name
    // Get sheet with current event name:
    var sheet = spreadsheet.getSheetByName(eventName);
    // Check if sheet with current event name exists. If it doesn't it creates it:
    if (!sheet) {
      sheet = spreadsheet.insertSheet(eventName);
      sheet.appendRow(headers);
    }
    // Appends current row of data to the new sheet:
    sheet.appendRow(row);

  }
}

我只需要帮助更改 sheet.appendRow(row); 行以仅提取唯一值。

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:
  • 您需要实现一个条件语句来验证 row[1] 中具有相同值的条目是否已经存在
  • 为此,您必须以与主工作表相同的方式循环遍历目标工作表的行
  • 使用flat()将值范围转换为简单数组
  • 将 B 列 (?) 中的条目与 row[1]indexOf() 进行比较

示例:

function createNewSheets() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var masterSheet = spreadsheet.getSheetByName('Raw');
  var data_range = masterSheet.getRange(1,2,masterSheet.getLastRow(),2).getValues();
  // Get headers row (to be appended on top when new sheet is created):
  var headers = data_range[0];
  // Iterate through all rows of data from Raw:
  for (var i = 1; i < data_range.length; i++) {
    var row = data_range[i]; // Current row
    var eventName = row[0]; // Event name
    // Get sheet with current event name:
    var sheet = spreadsheet.getSheetByName(eventName);
    // Check if sheet with current event name exists. If it doesn't it creates it:
    if (!sheet) {
      sheet = spreadsheet.insertSheet(eventName);
      sheet.appendRow(headers);
    }
    //retrieves values in column A of the destination sheet
    var sheetValuesB = sheet.getRange(1,2,masterSheet.getLastRow(),1).getValues();
    //transforms the values into a 1-D array
    sheetValuesB = sheetValuesB.flat();
    //check if row[1] already exists in sheet
    if(sheetValuesB.indexOf(row[1]) == -1){
      // Appends current row of data to the new sheet:
      sheet.appendRow(row);
    }        
  }
}

注释:

我鼓励您将 range 设置定义为限制 getLastRow() 检索包含数据的最后一行,而符号 B:C 也会遍历所有空行并使您的脚本变得不必要的慢。

【讨论】:

  • 太棒了!谢谢你,以及关于使用 getLastRow() 的优化说明。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2020-01-03
  • 2017-12-26
  • 2021-06-23
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多