copyTo函数仅在第二次传递时起作用,打嗝

时间:2018-06-16 16:01:49

标签: google-apps-script google-sheets

所以我弗兰肯斯坦大概在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});
}

1 个答案:

答案 0 :(得分:1)

在您调用setFormula后计算排序和过滤单元格可能需要一段时间,因此copyTo复制的值在您第一次运行时为空白。 arrayFormulas特别需要一段时间来计算。

尝试在flushsetFormula之间放置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});