如何从 google 应用程序脚本 google 传播 sheet 自定义单元格函数 [自定义函数刷新]
How to get auto refresh google spread sheet custom cell fuction from google app script [ custom fuction refresh ]
如何在创建新的 sheet 或更改 sheet 名称或复制 sheet 时通过 google 应用程序脚本自动刷新 sheet 名称的当前列表]s 或从 google 传播中删除 sheets sheet
:::::: 我需要 sheet 姓名的列表 ::::::::::::
- 有很多sheet个
- 新的sheet将由其他用户添加
- 新 sheet 的名称将被其他用户更改
- 一些 sheet 将被其他用户删除
- 我需要现有的 sheet 不超过
的名单
::::::::::::::::::::::::::::::::::::::::
sheet 名称列表应显示在第二个 sheet 代码表达式为 sheet[1]
以下代码运行良好。但它不会通过添加 sheets 或删除 sheets
来刷新
function sheetnames()
{
return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(x) {return x.getName();});
}
我相信你的情况和目标如下。
- 您正在使用
sheetnames()
的函数作为 Google Spreadsheet 上的自定义函数。
- 您已经确认
sheetnames()
的功能有效。
- 您想在 sheet 被删除、插入、复制和 sheet 名称更改时刷新自定义函数。
为了达到以上目的,我想提出以下方法。
用法:
1。准备脚本。
本例中Spreadsheet中刷新自定义函数sheetnames()
的示例脚本是运行的OnChange事件触发器。为此,请将以下示例脚本复制并粘贴到 Spreadsheet 的容器绑定脚本中,并保存脚本。
function onChange(e) {
var lock = LockService.getDocumentLock();
if (lock.tryLock(10000)) {
try {
const prop = PropertiesService.getScriptProperties();
if ((e.changeType === "OTHER" || e.changeType === "REMOVE_GRID" || e.changeType === "INSERT_GRID") && !prop.getProperty("run")) {
const formula = "=sheetnames"; // <--- Please set the function name of the custom function.
const ss = e.source;
const tempFormula = "=sampleFormula";
ss.createTextFinder("^\" + formula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
ss.createTextFinder("^\" + tempFormula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
prop.setProperty("run", "done");
} else {
prop.deleteProperty("run");
}
} catch(e) {
throw new Error(e);
} finally {
lock.releaseLock();
}
}
}
- 为了避免脚本重复运行,使用了
LockService
。
- 为了避免触发器的死循环,使用了
PropertiesService
。
2。安装 OnChange 事件触发器。
为了执行onChange
的函数,请给函数onChange
安装OnChange事件触发器。您可以在 this official document.
查看安装方法
3。测试
为了测试上面的脚本,在你安装函数onChange
作为可安装的OnChange事件触发器后,例如,请插入新的sheet。由此,您可以确认自定义函数sheetnames()
已刷新。
参考文献:
如何在创建新的 sheet 或更改 sheet 名称或复制 sheet 时通过 google 应用程序脚本自动刷新 sheet 名称的当前列表]s 或从 google 传播中删除 sheets sheet
:::::: 我需要 sheet 姓名的列表 ::::::::::::
- 有很多sheet个
- 新的sheet将由其他用户添加
- 新 sheet 的名称将被其他用户更改
- 一些 sheet 将被其他用户删除
- 我需要现有的 sheet 不超过 的名单
::::::::::::::::::::::::::::::::::::::::
sheet 名称列表应显示在第二个 sheet 代码表达式为 sheet[1]
以下代码运行良好。但它不会通过添加 sheets 或删除 sheets
来刷新function sheetnames()
{
return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(x) {return x.getName();});
}
我相信你的情况和目标如下。
- 您正在使用
sheetnames()
的函数作为 Google Spreadsheet 上的自定义函数。 - 您已经确认
sheetnames()
的功能有效。 - 您想在 sheet 被删除、插入、复制和 sheet 名称更改时刷新自定义函数。
为了达到以上目的,我想提出以下方法。
用法:
1。准备脚本。
本例中Spreadsheet中刷新自定义函数sheetnames()
的示例脚本是运行的OnChange事件触发器。为此,请将以下示例脚本复制并粘贴到 Spreadsheet 的容器绑定脚本中,并保存脚本。
function onChange(e) {
var lock = LockService.getDocumentLock();
if (lock.tryLock(10000)) {
try {
const prop = PropertiesService.getScriptProperties();
if ((e.changeType === "OTHER" || e.changeType === "REMOVE_GRID" || e.changeType === "INSERT_GRID") && !prop.getProperty("run")) {
const formula = "=sheetnames"; // <--- Please set the function name of the custom function.
const ss = e.source;
const tempFormula = "=sampleFormula";
ss.createTextFinder("^\" + formula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
ss.createTextFinder("^\" + tempFormula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
prop.setProperty("run", "done");
} else {
prop.deleteProperty("run");
}
} catch(e) {
throw new Error(e);
} finally {
lock.releaseLock();
}
}
}
- 为了避免脚本重复运行,使用了
LockService
。 - 为了避免触发器的死循环,使用了
PropertiesService
。
2。安装 OnChange 事件触发器。
为了执行onChange
的函数,请给函数onChange
安装OnChange事件触发器。您可以在 this official document.
3。测试
为了测试上面的脚本,在你安装函数onChange
作为可安装的OnChange事件触发器后,例如,请插入新的sheet。由此,您可以确认自定义函数sheetnames()
已刷新。