首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Utilities.sleep未按预期运行

Utilities.sleep未按预期运行
EN

Stack Overflow用户
提问于 2017-09-21 19:30:11
回答 1查看 1.4K关注 0票数 0

我有下面的脚本,它正在运行,但是在添加了utilities.sleep和应用程序刷新功能之后,它就不是了。有人能看到我做错了什么吗?当运行"nameofspreadsheet“时,脚本需要几秒钟的时间才能运行,并将正确的工作表名从工作簿名称中提取出来,放入A2中。因此,这意味着备份脚本运行,但在存档表中输入日期01/01/1970,而不是使用工作表的日期(我可能提前几个月复制多个副本,所以只需要在使用当天备份)。

代码语言:javascript
复制
function onOpen() { // This function adds a custom menu to the spreadsheet (Backup to archive) so you can run the script from there.
    var ui = SpreadsheetApp.getUi();
    ui.createMenu('Backup')
    .addItem('Backup','dataBackup')
    .addToUi();
}

function nameOfSpreadsheet()
{
    var s=SpreadsheetApp.getActive().getName().replace(/(\d{1,2}\.\d{1,2}\.\d{1,2}).*/,
'$1');
    return s;
}

function dataBackup() {
    var inputSS = SpreadsheetApp.getActiveSpreadsheet();
    var archiveSS = SpreadsheetApp.openById('146WU8RghfFqlCpCSX7n6kBAKOyxcpVKt14yhVfvYz-g');
    var user = Session.getActiveUser().getEmail();
    var sheetNames = ['AM trip', 'PM trip', 'Pool / Beach', 'Night Dive'];
    for (var i = 0; i < sheetNames.length; i++) {

        var inputSheet = inputSS.getSheetByName(sheetNames[i]);
        var archiveSheet = archiveSS.getSheetByName(sheetNames[i]);

        var date = inputSheet.getRange('A2').getValue(); // Changed to stop inadvertent cell changes, also made text white so not seen.
        var data = inputSheet.getRange('E7:U37').getValues().filter(function(row) { return row[0] !== '' || row[1] !== ''});

        for (var x = 0; x < data.length; x++) {
            data[x].splice(0, 0, date);
        }
        var getDate = archiveSheet.getRange(archiveSheet.getLastRow(), 1).getValue();
        var maxRowLength = data.reduce(function(length, row) { return Math.max(length, row.length); }, 0);
        var date = new Date(date); 

        if (date.getDate() === "Loading Data...") {
    Utilities.sleep(10000);
    SpreadsheetApp.flush();

            if (getDate.getDate() != date.getDate() || getDate.getMonth() != date.getMonth()) {     

                if (data.length != 0) {
                    archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), data.length);
                    archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, data.length, maxRowLength).setValues(data);
                } else {
                    archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), 1);
                    archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, 1, 2).setValues([[date, 'No Data']]);
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-17 18:16:03

date.getDate() === "Loading Data..."始终为false,true from将永远不会被执行,因为脚本的上方有下面一行

代码语言:javascript
复制
var date = new Date(date);

这一行为date分配一个日期时间,以便date.getDate(date)可以返回一个整数,如果date是一个有效的参数。顺便说一句,通常更好的做法是重用变量名,并使用它们拼写/写入类似于关键字的变量名称,因为这可能会导致某些程序员感到困惑。

date.getDate()永远不会返回“加载数据.”作为这个字符串,它不是JavaScript规范的一部分,但它来自Google。

考虑到上述问题,问题不是Utilities.sleep()。

如果你害怕

代码语言:javascript
复制
var date = inputSheet.getRange('A2').getValue();

可以返回“加载数据.”Utilities.sleep(毫秒)应该包含在该行之前。

关于SpreadsheetApp.flush(),应该在脚本对电子表格进行重要更改之后包含它。它在代码中的位置可能在for块的末尾,但也许最好重新考虑OP脚本的逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46351849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档