eli*_*0tt 1 google-sheets google-apps-script
我需要在开发人员元数据中存储工作表的上次修改用户和日期。
我使用 onEdit 函数在每次编辑工作表时更新这些元数据(请参阅下面的代码)
我的问题是在撤消历史记录中考虑了元数据创建/更新。
所以用户需要按 ctrl+Z 三次才能取消...
您知道避免这种行为的方法吗?
function onEdit(e) {
// Prevent errors if no object is passed.
if (!e) return;
var dateMetadata;
var dateKey = 'lastModificationDate';
var userMetadata;
var userKey = 'lastModificationUser';
// Get the active sheet.
var sheet = e.source.getActiveSheet();
var user = e.user.getEmail();
var date = Math.floor(Date.now() / 1000);
metadatas = sheet.getDeveloperMetadata();
for each (var m in metadatas) {
if (m.getKey() === dateKey) {
dateMetadata = m;
}
if (m.getKey() === userKey) {
userMetadata = m;
}
}
if (dateMetadata) {
dateMetadata.setValue(date);
} else {
sheet.addDeveloperMetadata(dateKey, date);
}
if (userMetadata) {
userMetadata.setValue(user);
} else {
sheet.addDeveloperMetadata(userKey, user);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案之一。
var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName)而不是var sheet = e.source.getActiveSheet().当你的脚本被修改后,它会变成如下所示。
function onEdit(e) {
Run Code Online (Sandbox Code Playgroud)
function installedOnEdit(e) {
Run Code Online (Sandbox Code Playgroud)
在这种情况下,请为 的功能安装可安装的 OnEdit 事件触发器installedOnEdit。至此,openById就可以使用了。
另外,请修改如下。
var sheet = e.source.getActiveSheet();
Run Code Online (Sandbox Code Playgroud)
var id = e.source.getId();
var sheetName = e.source.getActiveSheet().getSheetName();
var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
Run Code Online (Sandbox Code Playgroud)
onEdit来防止函数的双重运行installedOnEdit。参考号如果我误解了你的问题并且这不是你想要的方向,我很抱歉。
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |