构建 Google 个表格宏以进行自动更新
Building Google Sheets macros for auto update
我想进行自我更新 Google sheet 以在我的家庭项目中使用。
这是一个基本的细分:
我有一个 Google sheet 文件,其中包含多个作品 sheet(选项卡)。
我想添加将执行以下操作的宏:
如果我将值添加到名为 'incoming' 的 sheet 我希望值 (row/column) 自动添加到所有其他 sheets: 1..n
将新项目添加到 sheet 后(基本假设是 sheet 中的所有数据格式相同)我想要 sheets,用新数据对自己进行排序(根据我给他们的规则)
目前,我已经设置了 Google sheet,但我找不到自动更新的方法
下面是我的代码:
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);
}
文档中的数据示例
Main Sheet: Distillery | Type | Volume | Comment | Cheapest
Distributor | price | Distributor 1|...| Distributor N
Distirbutor Sheet: Distillery | Type | Volume | Comment | Lowest Price
| Update_Date 1 | ... | Update_Date N
Updates Sheet/New Data Sheet : Distillery | Type | Volume | Comment |
Price | Distributor| Date| Updated (Y/N)
Apps Script 为您提供自动触发功能,因此 onEdit(e) allows you to perform an action (e.g. append values) when an editing event takes place. Thereby, (e) is the event object,参数如 e.range
(编辑的范围)。
您可以访问e.range
的值、行和列。换句话说 - 您可以构建一个函数,该函数在每次修改范围时自动触发,并将范围的值附加到 workingSheet
中的相应范围。
我想进行自我更新 Google sheet 以在我的家庭项目中使用。 这是一个基本的细分: 我有一个 Google sheet 文件,其中包含多个作品 sheet(选项卡)。 我想添加将执行以下操作的宏:
如果我将值添加到名为 'incoming' 的 sheet 我希望值 (row/column) 自动添加到所有其他 sheets: 1..n
将新项目添加到 sheet 后(基本假设是 sheet 中的所有数据格式相同)我想要 sheets,用新数据对自己进行排序(根据我给他们的规则)
目前,我已经设置了 Google sheet,但我找不到自动更新的方法 下面是我的代码:
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);
}
文档中的数据示例
Main Sheet: Distillery | Type | Volume | Comment | Cheapest Distributor | price | Distributor 1|...| Distributor N
Distirbutor Sheet: Distillery | Type | Volume | Comment | Lowest Price | Update_Date 1 | ... | Update_Date N
Updates Sheet/New Data Sheet : Distillery | Type | Volume | Comment | Price | Distributor| Date| Updated (Y/N)
Apps Script 为您提供自动触发功能,因此 onEdit(e) allows you to perform an action (e.g. append values) when an editing event takes place. Thereby, (e) is the event object,参数如 e.range
(编辑的范围)。
您可以访问e.range
的值、行和列。换句话说 - 您可以构建一个函数,该函数在每次修改范围时自动触发,并将范围的值附加到 workingSheet
中的相应范围。