gpt4 book ai didi

javascript - 如何确保一个脚本 block 在下一个 block 之前先运行?

转载 作者:行者123 更新时间:2023-11-28 13:26:22 25 4
gpt4 key购买 nike

抱歉,如果这是一个基本问题,但我就是无法让它按照我需要的方式工作。

我有一个脚本,基本上由 3 部分组成:

1).删除工作表中的所有保护

2).执行一些复制功能(由于范围受到保护,我需要首先删除保护#1)

3). #2 完成后设置备份保护。

这是我的代码:

首先清除保护

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('COST REPORT');
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
protection.remove();
}
}

第二次清除单元格中的数据

 var costReport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'COST REPORT');
costReport.getRange('F12:F16').clearContent(); //Theoreticals
costReport.getRange('D20:D20').clearContent(); //Week Ending Date

Third sets protection

var ss = SpreadsheetApp.getActive().getSheetByName('COST REPORT');
var costReportCOGS = ss.getRange('G11:G16');
var protection = costReportCOGS.protect().setDescription('costReportCOGS');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
var costReportPurchaseEnding = ss.getRange('D11:E16');
var protection = costReportPurchaseEnding.protect().setDescription(
'costReportPurchaseEnding');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}

为了便于调试,我已经削减了一些脚本,但基本上我需要脚本按照这个顺序执行和完成,一个接一个。如果您只是尝试按原样运行脚本,则保护不会被删除,并且我会收到错误“尝试编辑 protected 范围......”

如果我单独运行每个 block ,那么它会完美运行,但它由用户必须运行的 3 个不同脚本组成,而我需要将其全部集成到一个脚本中。

提前致谢!

肖恩。

类似这样的吗?

        function removeProtection() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('COST REPORT');
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
protection.remove();
}
}
};

function clearRangeData() {
var costReport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'COST REPORT');
costReport.getRange('F12:F16').clearContent(); //Theoreticals
costReport.getRange('D20:D20').clearContent(); //Week Ending Date
};
function weeklyFileRangeProtection() {
//COST REPORT
var ss = SpreadsheetApp.getActive().getSheetByName('COST REPORT');
var costReportCOGS = ss.getRange('G11:G16');
var protection = costReportCOGS.protect().setDescription('costReportCOGS');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
};

最佳答案

您遇到问题是因为您为每个函数调用 SpreadsheetApp.getActiveSpreadsheet 。每次进行此调用时,您都会创建电子表格的虚拟“副本”,并且您对此副本所做的更改只会在整个脚本完成后传递到 Google 服务器中的版本。因此,如果您手动运行工作流程的 3 个函数中的每一个:

运行函数 1 -> 脚本完成 -> 更新服务器中的电子表格 -> 运行函数 2(现在获取更新的电子表格) -> 脚本完成 -> 更新服务器中的电子表格 -> 运行函数 3(现在获取重新更新的电子表格) -> 脚本完成 -> 更新服务器中的电子表格

现在,如果您运行这三个函数,脚本将发生如下情况:

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('COST REPORT'); 这将创建电子表格的虚拟副本 -> 您的代码会删除此副本的保护,并且服务器电子表格将被删除。未修改 -> 您再次调用 var costReport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('COST REPORT'); 创建服务器电子表格的新副本,该副本尚未删除其保护 -> 您的代码尝试清除此副本上的数据,这会触发错误。

正如 @Cameron Roberts 在他的回答中所建议的那样,调用之间的 Spreadsheet.flush() 将解决该问题,因为如果强制将更改同步到服务器中的电子表格。但是你还会遇到另一个“问题”,那就是你调用的副本数量,.getActiveSpreadsheet()非常耗时!最好只进行一次调用,存储在一个变量中(您已经这样做了,它是您的变量 ss)并对其进行所有编辑。

您的代码最终将如下所示:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var costReport = ss.getSheetByName('COST REPORT');

//First clear protection

var protections = costReport.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
protection.remove();
};
};

//Second clears data in cells

costReport.getRange('F12:F16').clearContent(); //Theoreticals
costReport.getRange('D20:D20').clearContent(); //Week Ending Date

//Third sets protection

var costReportCOGS = costReport.getRange('G11:G16');
var protection = costReportCOGS.protect().setDescription('costReportCOGS');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
};
var costReportPurchaseEnding = costReport.getRange('D11:E16');
var protection = costReportPurchaseEnding.protect().setDescription(
'costReportPurchaseEnding');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
};

此方法也适用于 Google Docs,它没有类似的 .flush() 方法来更新服务器版本。

关于javascript - 如何确保一个脚本 block 在下一个 block 之前先运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28822353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com