我的Google电子表格中有3个onEdit应用程序脚本函数,它们可以单独工作,但我无法确定在哪里放置括号来嵌套它们。
它们都在函数onEdit(e)下。我理解您不能像其他函数那样分离onEdit函数。如果我错了请告诉我。
这是我的代码,有点混乱,可能需要整理一下。
// Cut Employees Left from Unit Standards sheet and paste in Unit Standards - Employees Left sheet
function onEdit(e) {
var ss = e.source;
var sheet = ss.getActiveSheet();
var sheetName = "Unit Standards"
var range = e.range;
var editedColumn = range.getColumn();
var editedRow = range.getRow();
var column = 2;
var date = range.getValue();
// Object.prototype.toString.call(date) === '[object Date]' --> checks if value is date
// editedColumn == column && editedRow > 4 --> checks if edited cell is from 'Date Left'
// sheet.getName() == sheetName --> checks if edited sheet is 'Unit Standards'
if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 4 && sheet.getName() == sheetName) {
var numCols = sheet.getLastColumn();
var row = sheet.getRange(editedRow, 1, 1, numCols).getValues();
var destinationSheet = ss.getSheetByName("Unit Standards - Employees Left");
// Get first empty row:
var emptyRow = destinationSheet.getLastRow() + 1;
// Copy values from 'Unit Standards'
destinationSheet.getRange(emptyRow, 1, 1, numCols).setValues(row);
sheet.deleteRow(editedRow);
sheet.hideColumns(column);
}
//Dependent Dropdowns for Event/Incidents Sheet
{
var range = e.range;
var editedRow = range.getRow();
var spreadsheet = SpreadsheetApp.getActive();
var dropdownSheet = spreadsheet.getSheetByName("Dropdown Lists");
var eventsSheet = spreadsheet.getSheetByName("Events/Incidents");
var baseSelected = eventsSheet.getRange('C' + editedRow).getValue();
var column;
switch (baseSelected) {
case 'EBOP': column = 'A'; break;
case 'Tauranga': column = 'B'; break;
case 'Palmerston North': column = 'C'; break;
case 'Kapiti': column = 'D';
}
var startCell = dropdownSheet.getRange( column +'4');
var endCellNotation = startCell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getA1Notation();
var ruleRange = dropdownSheet.getRange(startCell.getA1Notation() + ':' + endCellNotation);
var dropdown1 = eventsSheet.getRange('D' + editedRow);
var dropdown2 = eventsSheet.getRange('E' + editedRow);
var rule1 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();
var rule2 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();
dropdown1.setDataValidation(rule1);
dropdown2.setDataValidation(rule2);
}
}
if (ss.getSheetName() == tabValidation) {
var lock = LockService.getScriptLock();
if (lock.tryLock(0)) {
autoid_(ss);
lock.releaseLock();
}
}
}
}
// Auto ID for Event/Incident Sheet
function autoid_(sheet) {
var data = sheet.getDataRange().getValues();
if (data.length < 2) return;
var indexId = data[1].indexOf('ID');
var indexDate = data[1].indexOf('Event/Incident Date');
if (indexId < 0 || indexDate < 0) return;
var id = data.reduce(
function(p, row) {
var year =
row[indexDate] && row[indexDate].getTime
? row[indexDate].getFullYear() % 100
: '-';
if (!Object.prototype.hasOwnProperty.call(p.indexByGroup, year)) {
p.indexByGroup[year] = [];
}
var match = ('' + row[indexId]).match(/(\d+)-(\d+)/);
var idVal = row[indexId];
if (match && match.length > 1) {
idVal = match[2];
p.indexByGroup[year].push(+idVal);
}
p.ids.push(idVal);
p.years.push(year);
return p;
},
{ indexByGroup: {}, ids: [], years: [] }
);
// Logger.log(JSON.stringify(id, null, ' '));
var newId = data
.map(function(row, i) {
if (row[indexId] !== '') return [row[indexId]];
if (isNumeric(id.years[i])) {
var lastId = Math.max.apply(
null,
id.indexByGroup[id.years[i]].filter(function(e) {
return isNumeric(e);
})
);
lastId = lastId === -Infinity ? 1 : lastId + 1;
id.indexByGroup[id.years[i]].push(lastId);
return [
Utilities.formatString(
'%s-%s',
id.years[i],
('000000000' + lastId).slice(-3)
)
];
}
return [''];
})
.slice(1);
sheet.getRange(2, indexId + 1, newId.length).setValues(newId);
}
/**
*
* @param {any} n
* @return {boolean}
*/
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
第一项职能是:
//削减单位标准表中留下的员工并粘贴在单元标准中-员工左表
二是:
//事件/事件表的受抚养人下拉列表
三是:
//事件/事件单的自动ID
我已经看过以前关于这个问题的答案了,但仍然无法想出如何把括号放在正确的位置,让它们正常工作。我真的很感谢你的帮助。
发布于 2019-11-28 06:52:39
你想做什么还不太清楚。首先,您的第二个函数甚至没有定义。所以,我试着用我能理解的代码来回答,但是您必须检查条件。
我建议您使您的每个功能独立。在您的onEdit()中,您可以在满足特定条件时调用它们。例如:
function onEdit(e) {
var sheetName = e.range.getSheet().getName();
if (sheetName == "Sheet1") {
// do something
} else if (sheetName == "Sheet2") {
// do something else
}
}有了这种结构,只要满足了特定条件,就可以很容易地调用所需的函数。这是最后的代码,但同样,当我在这里输入虚拟值时,请检查条件。
function onEdit(e) {
var value = e.range.getValue();
var sheetName = e.range.getSheet().getName();
if (
Object.prototype.toString.call(value) === "[object Date]" && // Check if value is a date
sheetName == "Unit Standards" && // checks if edited sheet is 'Unit Standards'
e.range.columnStart == 2 && // checks if edited cell is from 'Date Left'
e.range.rowStart > 4
) {
moveEmployees_(e.range);
} else if (sheetName == "Sheet2" && e.range.rowStart == 2 && e.range.columnStart == 2) {
dependentDropdowns_(e.range);
} else if (sheetName == "Sheet3" && e.range.rowStart == 3 && e.range.columnStart == 3) {
autoid_(e.range.getSheet());
}
}
/**
* Cut Employees Left from Unit Standards sheet and paste in Unit Standards - Employees Left sheet
* @param {Range} range
*/
function moveEmployees_(range) {
var sheet = range.getSheet();
var editedRow = range.getRow();
var column = 2;
var numCols = sheet.getLastColumn();
var row = sheet.getRange(editedRow, 1, 1, numCols).getValues();
var destinationSheet = ss.getSheetByName("Unit Standards - Employees Left");
// Get first empty row:
var emptyRow = destinationSheet.getLastRow() + 1;
// Copy values from 'Unit Standards'
destinationSheet.getRange(emptyRow, 1, 1, numCols).setValues(row);
sheet.deleteRow(editedRow);
sheet.hideColumns(column);
}
/**
* Dependent Dropdowns for Event/Incidents Sheet
* @param {Range} range
*/
function dependentDropdowns_(range) {
var editedRow = range.getRow();
var spreadsheet = SpreadsheetApp.getActive();
var dropdownSheet = spreadsheet.getSheetByName("Dropdown Lists");
var eventsSheet = spreadsheet.getSheetByName("Events/Incidents");
var baseSelected = eventsSheet.getRange('C' + editedRow).getValue();
var column;
switch (baseSelected) {
case 'EBOP': column = 'A'; break;
case 'Tauranga': column = 'B'; break;
case 'Palmerston North': column = 'C'; break;
case 'Kapiti': column = 'D';
}
var startCell = dropdownSheet.getRange(column + '4');
var endCellNotation = startCell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getA1Notation();
var ruleRange = dropdownSheet.getRange(startCell.getA1Notation() + ':' + endCellNotation);
var dropdown1 = eventsSheet.getRange('D' + editedRow);
var dropdown2 = eventsSheet.getRange('E' + editedRow);
var rule1 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();
var rule2 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();
dropdown1.setDataValidation(rule1);
dropdown2.setDataValidation(rule2);
}
/**
* Auto ID for Event/Incident Sheet
* @param {Sheet} sheet
*/
function autoid_(sheet) {
var data = sheet.getDataRange().getValues();
if (data.length < 2) return;
var indexId = data[1].indexOf('ID');
var indexDate = data[1].indexOf('Event/Incident Date');
if (indexId < 0 || indexDate < 0) return;
var id = data.reduce(
function (p, row) {
var year = row[indexDate] && row[indexDate].getTime ? row[indexDate].getFullYear() % 100 : '-';
if (!Object.prototype.hasOwnProperty.call(p.indexByGroup, year)) {
p.indexByGroup[year] = [];
}
var match = ('' + row[indexId]).match(/(\d+)-(\d+)/);
var idVal = row[indexId];
if (match && match.length > 1) {
idVal = match[2];
p.indexByGroup[year].push(+idVal);
}
p.ids.push(idVal);
p.years.push(year);
return p;
}, { indexByGroup: {}, ids: [], years: [] }
);
var newId = data.map(function (row, i) {
if (row[indexId] !== '') return [row[indexId]];
if (isNumeric(id.years[i])) {
var lastId = Math.max.apply(null, id.indexByGroup[id.years[i]].filter(function (e) {
return isNumeric(e);
}));
lastId = lastId === -Infinity ? 1 : lastId + 1;
id.indexByGroup[id.years[i]].push(lastId);
return [Utilities.formatString('%s-%s', id.years[i], ('000000000' + lastId).slice(-3))];
}
return [''];
}).slice(1);
sheet.getRange(2, indexId + 1, newId.length).setValues(newId);
}
/**
* Check if an object is numeric.
* @param {*} n
* @return {boolean}
*/
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}最后,为了解决您对方括号的关切,这里不需要嵌套函数。如果您真的想这样做,那么您只需将所有嵌套函数直接放在“父”函数的最后一个括号之前。
function parent() {
var result = isNumeric("abc");
Logger.log(result); // false
return result;
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
}https://stackoverflow.com/questions/58985077
复制相似问题