2行脚本需要半分钟才能执行?

时间:2017-10-25 20:53:53

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

我有一个功能:

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()的问题。

任何想法为什么会这样非常感激。感谢名单。

1 个答案:

答案 0 :(得分:1)

通过创建自定义菜单选项&#34;自定义 - &gt;解决了我的问题重复和姓名&#34;将预先设计的模板表复制到所有工作表的末尾,并从&#34;类别&#34;中的名称列表中命名。根据同时创建的工作表索引,只需点击两次鼠标

我花了一个星期的谷歌搜索和研究,并在这里共同努力

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