【问题标题】:2 lines of script take half minutes to execute?2行脚本需要半分钟才能执行?
【发布时间】:2017-10-25 20:53:52
【问题描述】:

我有一个函数:

function reNameThisSheet() {
    var active = SpreadsheetApp.getActiveSheet();
    active.setName(active.getRange('A2').getValue());
}

我通过在脚本编辑器中按运行按钮手动触发,执行它需要半分钟以上(32 - 33 秒)=在所需工作表上获得所需名称。

我在复制电子表格中的最后一张工作表之后运行这个函数,在运行这个函数之前我运行另一个函数,它根据工作表索引设置 A2 中的值。

根据活动工作表的工作表索引将值设置为A2的函数是一个原生公式:

=indirect("Category!B" & (ReturnSheetIndex()-1))

其中包括自定义公式 ReturnSheetIndex():

function ReturnSheetIndex() {
  var sheetIndex  = SpreadsheetApp.getActiveSheet().getIndex();
  Logger.log(sheetIndex);
  return sheetIndex;
}

我手动触发此功能,以便我在脚本管理器中指向它并单击保存,从而立即设置 A2 中的值。

在 A2 中的值立即设置后,函数 reNameThisSheet() 需要很长时间才能重命名通过复制最后一张表创建的表。

所有这些都发生在电子表格中: https://docs.google.com/spreadsheets/d/151TbRey12wGrbdfcGI14U50b5dNcJaHCX2UKRVv6teA/edit?usp=sharing

另外的测试给出了以下结果:

当我关闭电子表格并再次打开它时,它甚至无法正确加载由复制过程创建的工作表:(

挂断了……

使用公式创建的工作表的标题:

=CONCATENATE(indirect("Category!C" & (1+findCell())),"  od  ", TEXT(MIN(E5:E),"dd.mm.yyyy") ,"  do  ", TEXT(MAX(E5:E),"dd.mm.yyyy") ," :")

甚至没有出现:(

错误:正在加载数据...出现在每张纸的第一行并保持不变:(

我认为功能有问题:

function findCell() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Category");
  var sheet1 = ss.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  var student = sheet1.getRange("A2").getValue();
  for (var i = 0; i < values.length; i++) {
    var row = "";
    for (var j = 0; j < values[i].length; j++) {     
      if (values[i][j] == student) {
        row = values[i][j+1];
        return i;
      }
    }    
  }  
}

在使用重复创建的工作表的第 1 行中创建标题时包含此内容。

但有趣的是:如果我在重新打开电子表格后尝试复制最后一张工作表,一切正常。

只有在关闭和重新打开之前创建的工作表存在不加载函数 findCell() 的问题。

任何想法为什么会这样将不胜感激。谢谢。

【问题讨论】:

  • 我创建了一个副本,它对我来说运行得非常快,也许可以尝试一下
  • 出了点问题。请重新加载。计算时出错;某些公式可能无法成功计算。撤消上一次更改,然后重试。解雇。无法加载文件尝试再次加载或发送错误报告
  • 当我按照您的建议制作副本并尝试复制最后一张纸时出现此错误。但是在重新加载复制的电子表格后,一切看起来都很好......我不明白任何解释都将非常感激。谢谢。
  • 您是否尝试关闭复制的电子表格并再次打开?这样做并浏览工作表,您会发现工作表不是应有的样子......标题是错误的,A5 =sort(过滤器......的公式结果......也是错误的......都是因为功能没有正确重新计算的 findCell() ???
  • 电子表格有多大?如果它有很多表格和公式,那么这可能就是为什么它似乎需要很长时间

标签: performance google-apps-script google-sheets custom-controls customization


【解决方案1】:

通过创建自定义菜单选项“自定义 -> 复制和名称”解决了我的问题,该选项将预先设计的模板表复制到所有工作表的末尾,并根据索引从“类别”工作表中的名称列表中对其进行命名只需单击两次鼠标即可同时创建的工作表

我花了一周的时间在谷歌上搜索和研究,并在这里费心把它整理好

function duplicateName() {
  var menu = [{name: "Duplicate and Name", functionName: "dupName"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
}

function dupName() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var totalSheets = ss.getNumSheets();
  var lastSheet = ss.getSheets()[totalSheets-1];
  var currentSheet = SpreadsheetApp.setActiveSheet(lastSheet);
  var templateSheet =  ss.getSheetByName("Template");
  var getNameFromSheet = ss.getSheetByName("Category");  
//  var name = Browser.inputBox('Enter new sheet name');
  var getNameFromRow =  SpreadsheetApp.getActiveSheet().getIndex()-1;
  var name = getNameFromSheet.getRange(getNameFromRow, 2).getValue();
  var dateCell = getNameFromSheet.getRange(getNameFromRow, 2); 
  var ui = SpreadsheetApp.getUi();
    if (dateCell.isBlank()) {                         
     var result = ui.alert(
     'Vse Kategorije so že odprte',
     'Ni več možno ustvariti nove kartice!',
      ui.ButtonSet.OK);
  } else {
      ss.insertSheet(name, {template: templateSheet});
  }
}

它可以作为魅力:

https://docs.google.com/spreadsheets/d/1Kte7OU0WB-u8fDhASWDLQzLJaf7dSRvxUgRfY5pIObg/edit?usp=sharing

【讨论】:

  • 本站的回答和问题应该写成技术文档,所以请不要包含表情符号、称呼、问候、谢谢……参考:-What should I keep out of my posts and titles
  • 你可以像往常一样给我一个减号 :)
  • 如果你不能帮助,至少尽量不要通过投反对票来造成伤害。这是我对你的谦卑要求,并表示应有的尊重。我向你致以最诚挚和最诚挚的敬意。谢谢先生。
  • 我还没有对这个问答进行投票 :) 当你的帖子被否决时,你不应该感到被冒犯,而是应该考虑是否可以改进它们。
猜你喜欢
  • 2018-02-13
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2021-12-14
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多