Pra*_*acy 1 javascript google-sheets google-apps-script google-sheets-api
希望使用可安装的触发器获取新添加的工作表(手动添加)的名称。带有 INSERT_GRID 的 ChangeType 对我来说工作得很好(通过在添加工作表时输出一些随机值进行测试),但是当我尝试获取新添加的工作表的名称时,它却给了我文档中第一个工作表名称的值。
还有其他选择吗?听说这可能是应用程序脚本中以前的错误。
function log(e)
{
if (e.changeType === "INSERT_GRID") {
var news = e.source.getActiveSheet().getName(); //fails to get correct value
e.source.getSheetByName("Client").getRange(1, 1).setValue(news);
}}
Run Code Online (Sandbox Code Playgroud)
我相信你的目标如下。
为此,这个答案怎么样?
不幸的是,在现阶段,OnChange事件触发器的事件对象似乎没有有关添加的sheet的信息。这样,当使用您的脚本时,将检索第一个选项卡的工作表名称。我不确定这是错误还是当前规范。
因此,为了实现您的目标,我想提出以下解决方法。此解决方法的流程如下。
要使用此脚本,请关闭 Google 电子表格并再次打开。由此,onOpen运行并将初始工作表名称保存到 PropertiesService。然后,当添加工作表时,检索添加的工作表并将添加的工作表的工作表名称放入单元格中。
function saveCurrentSheets(prop, spreadsheet) {
const sheets = spreadsheet.getSheets().reduce((o, s) => Object.assign(o, {[s.getSheetName()]: true}), {});
prop.setProperty("sheets", JSON.stringify(sheets));
}
function onOpen(e) {
saveCurrentSheets(PropertiesService.getScriptProperties(), e.source);
}
function log(e) {
if (e.changeType === "INSERT_GRID") {
const prop = PropertiesService.getScriptProperties();
const oldSheets = prop.getProperty("sheets");
if (!oldSheets) {
saveCurrentSheets(prop, e.source);
return;
}
const oldSheetsObj = JSON.parse(prop.getProperty("sheets"));
const addedSheet = e.source.getSheets().filter(s => !oldSheetsObj[s.getSheetName()])[0];
const news = addedSheet.getSheetName();
e.source.getSheetByName("Client").getRange(1, 1).setValue(news);
saveCurrentSheets(prop, e.source);
} else if (e.changeType === "REMOVE_GRID") {
saveCurrentSheets(PropertiesService.getScriptProperties(), e.source);
}
}
Run Code Online (Sandbox Code Playgroud)
log。| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |