我有下面的脚本正在运行但是在添加utilities.sleep
和应用程序刷新功能之后却没有。谁能看到我做错了什么?当“nameofspreadsheet”运行时,脚本运行需要几秒钟,并将正确的工作表名称放在A2中,取自工作簿名称。因此,这意味着备份脚本会运行,但会在存档表中输入日期01/01/1970,而不是使用工作表的日期(我可能提前几个月制作多份副本,因此在使用它的当天只需要备份)。
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']]);
}
}
}
}
}
答案 0 :(得分:0)
date.getDate() === "Loading Data..."
总是为false,而且if将永远不执行,因为在脚本上方有以下行
var date = new Date(date);
此行将日期时间分配给date
,因此如果date
是有效参数,则date.getDate(date)可以返回整数。顺便说一句,通常最好重用变量名称并使用变量名称,拼写/写入类似于关键字,因为这可能会导致某些程序员感到困惑。
date.getDate()永远不会返回“正在加载数据...”,因为它不是JavaScript规范的一部分,而是来自Google表格。
考虑到上述问题,不是Utilities.sleep()。
如果你害怕
var date = inputSheet.getRange('A2').getValue();
可以返回“正在加载数据......”应该在该行之前包含Utilities.sleep(毫秒)。
关于SpreadsheetApp.flush(),应在脚本对电子表格进行重要更改后包含它。它在代码中的位置可能在for块的末尾,但也许最好重新考虑OP脚本的逻辑。