Google apps script 来自库don';行不通
我创建了一个库(“CustomerReportLibrary”),其中包含一些函数,我从电子表格脚本中为这些函数创建了可安装的OneEdit触发器。 此库中的两个特定函数不起作用(其他函数起作用)。有人能解释一下原因吗 不起作用的功能:Google apps script 来自库don';行不通,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我创建了一个库(“CustomerReportLibrary”),其中包含一些函数,我从电子表格脚本中为这些函数创建了可安装的OneEdit触发器。 此库中的两个特定函数不起作用(其他函数起作用)。有人能解释一下原因吗 不起作用的功能: function restoreRangeSettings(e) { // retrieves data validation, conditional formatting and formatting settings from template var
function restoreRangeSettings(e) {
// retrieves data validation, conditional formatting and formatting settings from template
var spreadsheet = SpreadsheetApp.getActive();
var range = e.range;
var sheet = range.getSheet();
var A1Notation = range.getA1Notation();
var templateRange = spreadsheet.getSheetByName(sheet.getName() + ' design').getRange(A1Notation);
templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);
templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
}
function logTimestamp(e) {
// logs task last edit timestamp
var spreadsheet = SpreadsheetApp.getActive();
var sheet = e.range.getSheet();
var editedCell = sheet.getActiveCell();
var editedRow = editedCell.getRow();
var editedColumn = editedCell.getColumn();
var emailCell = sheet.getRange(editedRow,5);
var dateCell = sheet.getRange(editedRow,4);
var time = new Date();
time = Utilities.formatDate(time, "GMT+02", "dd/MM/yyyy HH:mm:ss");
// don't do anything if edited sheets are not task sheets
if ((sheet.getName() == 'instructions') || (sheet.getName() == 'generate report')) {return;}
// logs timestamp when the edited range is within the task documentation table
if ((editedColumn() > 7) && (editedRow > 4)) {
// adds user and month to also to next row when task is added
if ((sheet.getRange(editedRow,5,1,3).getValues() != '') && (editedColumn == 8) && (sheet.getRange(editedRow+1,4).isBlank())) {
sheet.getRange(editedRow+1,5,1,3).setValues(sheet.getRange(editedRow,5,1,3).getValues());
}
dateCell.setValue(time);
}
}
电子表格脚本中的代码:
function EditTriggers() {
var customerSsId = SpreadsheetApp.getActive().getId();
var customerSpreadsheet = SpreadsheetApp.openById(customerSsId);
ScriptApp.newTrigger('CustomerReportLibrary.restoreRangeSettings')
.forSpreadsheet(customerSpreadsheet)
.onEdit()
.create();
ScriptApp.newTrigger('CustomerReportLibrary.logTimestamp')
.forSpreadsheet(customerSpreadsheet)
.onEdit()
.create();
//works fine
ScriptApp.newTrigger('CustomerReportLibrary.showRowsAndComments')
.forSpreadsheet(customerSpreadsheet)
.onEdit()
.create();
//works fine
ScriptApp.newTrigger('CustomerReportLibrary.optShortcuts')
.forSpreadsheet(customerSpreadsheet)
.onEdit()
.create();
}
提前谢谢 我很高兴告诉大家,问题已经解决了 第一个动作(logTimestamp) 我无意中将editedColumn称为函数而不是变量 第二个动作(恢复设置) 我选择了一种不同的策略来获得所需的结果。(请参阅关于我试图实现的目标的讨论。) 第三项行动(一般) 我玩了一点游戏。例如,将范围定义为“
e.range
”不起作用,而将其定义为“e.source.getActiveRange()
”则神奇地起作用
最终-最终代码
注意:电子表格脚本没有更改。到底什么不起作用?函数本身或调用它们
onEdit
?如果您发现一个,请确保在从中复制代码并使用它询问其他问题之前执行。
if ((editedColumn() > 7) && (editedRow > 4)) {
function restoreRangeSettings(e) {
// retrieves data validation, conditional formatting and formatting settings from template
var editedSs = e.source;
var editedRange = editedSs.getActiveRange();
var editedSh = editedRange.getSheet().getName();
var templateSs = SpreadsheetApp.openById('10zVclYTCEOEwskUID4vxSPxKR_tb3RaR76eG7TfxLUE');
var templateSh = templateSs.getSheetByName(editedSh);
var copiedSh = templateSh.copyTo(editedSs).hideSheet();
var templateRange = editedSs.getSheetByName(copiedSh.getName()).getRange(editedRange.getA1Notation());
templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);
templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
editedSs.deleteSheet(copiedSh);
}
function logTimestamp(e) {
// logs task last edit timestamp
var editedRange = e.range;
var editedSh = editedRange.getSheet();
var editedRow = editedRange.getRow();
var editedColumn = editedRange.getColumn();
var emailCell = editedSh.getRange(editedRow,5);
var dateCell = editedSh.getRange(editedRow,4);
var time = new Date();
time = Utilities.formatDate(time, "GMT+02", "dd/MM/yyyy HH:mm:ss");
// don't do anything if edited sheets are not task sheets
if ((editedSh.getName() == 'instructions') || (editedSh.getName() == 'generate report')) {return;}
// logs timestamp when the edited range is within the task documentation table
if ((editedColumn > 7) && (editedRow > 4)) {
// adds user and month to also to next row when task is added
if ((editedSh.getRange(editedRow,5,1,3).getValues() != '') && (editedColumn == 8) && (editedSh.getRange(editedRow+1,4).isBlank())) {
editedSh.getRange(editedRow+1,5,1,3).setValues(editedSh.getRange(editedRow,5,1,3).getValues());
}
dateCell.setValue(time);
}
}