就上下文而言,我有一个用于库存和定价的谷歌表格。我制作了另一个电子表格,导入我们需要的原始范围,以便向客户显示批发库存,无需任何定价。我目前正在使用
ImportRange()
复制内容,但我想保留上一张纸的格式。
我正在使用这个
onEdit()
脚本来更新格式(我在原始版本中使用触发器):
function setFormatOnEdit(e) {
if (!e)
throw new Error("This function is automatically called, do not run this manually")
const lock = LockService.getScriptLock()
if (lock.tryLock(350000)) {
try {
const {
master,
sources
} = variables_();
const { range, source } = e;
const { editRange } = sources.find(({ sheetName }) => sheetName == source.getSheetName());
const srcRange = source.getRange(editRange);
const editedSheetName = range.getSheet().getSheetName();
if (editedSheetName != srcRange.getSheet().getSheetName())
return;
//Reformatting Code Here
} catch ({stack}) {
console.error(stack)
} finally {
lock.releaseLock();
console.log("Done");
}
} else { console.error("Timeout") }
}
变量_() 是:
function variables_() {
const masterSpreadsheetId = "###"
const sourceSheetName1 = "Mixed Oak"
...
const sourceSheetName13 = "Misc/Random Inventory"
const sourceSheet1Range = "Mixed Oak!A1:I"
...
const sourceSheet13Range = "Misc/Random Inventory!A1:I"
return {
master: { masterSpreadsheetId },
sources: [
{ sheetName: sourceSheetName1, editRange: sourceSheet1Range },
...
{ sheetName: sourceSheetName13, editRange: sourceSheet13Range }
]
};
}
目前,我遇到了 e.source 在每次编辑后返回源电子表格中的第一张工作表(这是定价表的摘要;我不想复制此工作表)的问题,无论编辑哪张工作表。
这会带来问题,因为我尝试使用已编辑原件的工作表名称来在每次编辑时重新格式化副本表。
我可以使用条件格式来重新格式化副本,但可能的选项较少,而且我需要在所有行中搜索某些格式参数,这将需要很长时间才能更新,而且很笨重。
让我知道是否有办法解决此问题,或者是否有更好的方法来完成我正在尝试进行的复制操作。
编辑事件触发器的
source
属性返回活动的 SpreasheetApp.Spreadsheet
,而不是 SpreadsheetApp.Sheet
。
另一方面,问题中脚本的以下部分对我来说没有意义:
const { editRange } = sources.find(({ sheetName }) => sheetName == source.getSheetName());
const srcRange = source.getRange(editRange);
const editedSheetName = range.getSheet().getSheetName();
if (editedSheetName != srcRange.getSheet().getSheetName())
return;
如果您想要获取编辑范围,请使用
e.range
或 SpreadsheetApp.getActiveSheet().getActiveRange()
。出于简洁考虑,首选第一个选项,而且直观上它应该更快。此外,返回的对象还扩展了属性 rowStart
、columnStart
、rowEnd
和 columnEnd
,这些属性在许多用例中都很方便。
要获取已编辑工作表的名称,您可以使用
e.range.getSheet().getName()
或 e.source.getActiveSheet().getName()
、SpreadsheetApp.getActiveSheet().getName()
。前两个选项中的任何一个都是首选。