所以我弗兰肯斯坦大概在6-8个月左右之前发现了这个剧本。当我上次使用它时,一切都按照预期完成,但现在它已经坏了。我试图获取x个人的列表,并随机化列表或保持列表的顺序相同,然后删除任何空单元格,然后将该信息复制到静态列,我可以用于以后的表格。
目前正在发生的事情,无论我是否尝试随机化,在我的第一次传递中,排序和/或过滤器公式工作得很完美,但信息根本不会复制。它应该最终显示在scriptsLocked
列中的工作表C
上。现在在第一次传递之后,如果我再次立即运行相同的选项(随机或设置),它将最终运行copyTo,但它将第一个单元格保留为scriptsLocked C1
,其余复制的信息是完好无损,但缺少第一个价值。任何帮助都会非常棒,谢谢!!
这是我的整个脚本代码:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('4mans Menu')
.addItem('Clear Sheet', 'clearSheet')
.addSubMenu(ui.createMenu('Generate Champ Lobbies')
.addItem('Random', 'champMenuRandom')
.addItem('Set', 'champMenuSet'))
.addToUi();
}
function clearSheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
sheet.getRange("scriptsLocked!A1:C32").clearContent();
sheet.getRange("champLobby!B4:C35").clearContent();
sheet.getRange("champData!D2:H97").clearContent();
sheet.getRange("champData!M2:Q97").clearContent();
}
function champMenuRandom() {
var sheetScriptsLocked = "scriptsLocked"
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetScriptsLocked);
var cell = sheet.getRange("A1");
var cell2 = sheet.getRange("B1");
cell.setFormula("=sort('champLobby'!B4:B35,arrayFormula(randbetween(sign(row('champLobby'!B4:B35)),1000000)),true)");
cell2.setFormula("=filter('scriptsLocked'!A1:A32; len('scriptsLocked'!A1:A32))")
sheet.getRange("B1:B32").copyTo(sheet.getRange("C1"), {contentsOnly:true});
}
function champMenuSet() {
var sheetScriptsLocked = "scriptsLocked"
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetScriptsLocked);
var cell = sheet.getRange("B1");
cell.setFormula("=filter('champLobby'!B4:B35; len('champLobby'!B4:B35))");
sheet.getRange("B1:B32").copyTo(sheet.getRange("C1"), {contentsOnly:true});
}
答案 0 :(得分:1)
在您调用setFormula
后计算排序和过滤单元格可能需要一段时间,因此copyTo
复制的值在您第一次运行时为空白。 arrayFormulas特别需要一段时间来计算。
尝试在flush
和setFormula
之间放置getRange
:
cell.setFormula("=sort('champLobby'!B4:B35,arrayFormula(randbetween(sign(row('champLobby'!B4:B35)),1000000)),true)");
cell2.setFormula("=filter('scriptsLocked'!A1:A32; len('scriptsLocked'!A1:A32))")
SpreadsheetApp.flush();
//If that doesn't work try sleep for 1 or more sec:
//Utilities.sleep(1 * 1000)
sheet.getRange("B1:B32").copyTo(sheet.getRange("C1"), {contentsOnly:true});