构建Google表格宏以进行自动更新

时间:2019-07-11 05:36:58

标签: google-apps-script google-sheets google-sheets-macros

我想制作一个自我更新的Google表格以用于我的家庭项目。 这是一个基本的细分: 我有一个带有多个工作表(标签)的Google工作表文件。 我想添加将执行以下操作的宏:

  1. 如果我将值添加到称为“传入”的工作表中,我希望将值(行/列)自动添加到所有其他工作表中:1..n

  2. 一旦将新项目添加到工作表(基本假设是工作表中的所有数据都是相同的格式),我希望工作表用新数据对自身进行排序(基于规则)给他们)

当前,我已经设置了Google工作表,但找不到自动更新的方法 下面是我的代码:


function updateOnNewRow() {
  //#TODO: Add a trigger gor a specific sheet in the spreadsheet 
  var updatesSheet ="";
  var notificationEmail ="";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var updatedSheetName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  var lastRow = sheet.getLastRow();
  var numRows = 1;   // Number of rows to process
  var cols = sheet.getLastColumn();
  // Fetch the range of cells
  var dataRange = sheet.getRange(lastRow, 1, numRows, cols)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();

  // Fetch your row as an array
  var lastRowData = data[0];
  var newEntry = lastRowData.join(",");

  // get all sheets
  var sheetNameArray = [];
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  sheetNameArray = sheets.map(function(sheet){
    return [sheet.getName()];
  });  
  // cycle through sheets :   
  for (var priceSheet in sheets)
  {
    //ignore 'updates' sheet
    var currentSheet = sheets[priceSheet].getSheetName();
    if (currentSheet==null)
      {
        // Handle sheet name failure
        var errorMessage = "getSheetByName returend null";
        Logger.log(errorMessage);        
      }
    else if (currentSheet != updatedSheetName) 
    {
      //get Sheet
      var formattedData = []
      var workingSheet = SpreadsheetApp.getActive().getSheetByName(currentSheet);
      // Get all populated rows in sheet:
      var workDataRange = workingSheet.getDataRange().getValues();      
      // created formatted data array
      for (var i = 1; i < workDataRange.length; i++) {
        var row = workDataRange[i];
        var dataRow = row.join(",");
        formattedData.push(dataRow)
        Logger.log(row + " : Added to the array");
      } 
      if (formattedData.indexOf(newEntry)<0)
      {
        workingSheet.appendRow(lastRowData);
        Logger.log("Appended to sheet: "+currentSheet+"; Row:"+newEntry);
      }
    }  
  }
  // Format data by separating values into comma separated list for email
  //var emailContent = lastRowData.join(",");
  // Send an email (change this to your email)
  //MailApp.sendEmail(notificationEmail, 'Email subject', emailContent);
  // Log contents for debugging      
 // Logger.log(emailContent);
}

文档中的数据示例

  

主页:酿酒厂|类型数量评论|最便宜的   分销商价格|发行人1 | ... |发行人N

     

Distirbutor表:酿酒厂|类型数量评论|最低价格   |更新日期1 | ... | Update_Date N

     

更新表/新数据表:酿酒厂|类型数量评论|   价格发行人|日期|更新(是/否)

1 个答案:

答案 0 :(得分:3)

Apps脚本为您提供了自动触发功能,因此onEdit(e)允许您在发生编辑事件时执行操作(例如附加值)。因此,(e)是event object,其参数为e.range(已编辑的范围)。

您可以访问e.range的值,行和列。换句话说,您可以构建一个函数,该函数会在每次修改范围时自动触发,并将该范围的值附加到workingSheet中的相应范围。