Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何将主Google工作表中的新值附加到具有条件的多个工作表中_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何将主Google工作表中的新值附加到具有条件的多个工作表中

Google apps script 如何将主Google工作表中的新值附加到具有条件的多个工作表中,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个主谷歌表,有五列,每天自动更新 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

我有一个主谷歌表,有五列,每天自动更新

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
同一文档在主表中有三种类型事件的对应表:ABC、DEF和GHI。这些图纸中包含现有值

我想要一个Google Apps脚本,在编辑主控表时,只将Value1中的唯一值和新值添加到相应的事件表中。例如:

工作表ABC

Value
A
B
C
图纸定义

Value
A
B
D
表GHI

Value
A
C
它实际上并不取决于日期,而是查看相应表格中已经存在的内容

我是谷歌应用程序脚本的完全初学者。我已经研究了其他解决方案,我所做的最远的工作就是找到如何根据事件值动态创建不同的工作表

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

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);

  }
}
函数createNewSheets(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
var masterSheet=spreadsheet.getSheetByName('Raw');
var data_range=masterSheet.getRange('B:C').getValues();
//获取标题行(创建新图纸时追加在顶部):
var headers=数据范围[0];
//遍历原始数据中的所有数据行:
对于(变量i=1;i
我只需要帮助更改
工作表.appendRow(row)行仅提取唯一值。

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

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);
    }        
  }
}
函数createNewSheets(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
var masterSheet=spreadsheet.getSheetByName('Raw');
var data_range=masterSheet.getRange(1,2,masterSheet.getLastRow(),2).getValues();
//获取标题行(创建新图纸时追加在顶部):
var headers=数据范围[0];
//遍历原始数据中的所有数据行:
对于(变量i=1;i
注释:

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);
    }        
  }
}

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

我不确定,但这个插件可以帮助您实现惊人的速度!感谢您的支持,以及关于使用getLastRow()的优化说明。谢谢你的帮助!