无尽的#34;加载。 。 。 "在用户定义的功能上

时间:2014-09-19 00:10:40

标签: google-sheets user-defined-functions hashcode array-formulas

我在Google表格单元格中有一个公式,只要我不关闭电子表格,效果很好。如果我这样做,当我再次打开它时,细胞会永远说“正在加载......”。

这是公式,在单元格H1中:

=ARRAYFORMULA(if( A1:A1000 = "", "", strArrayHash(G1:G1000)))

我也尝试过,并采用相同的行为:

=if( A1 = "", "", strHash(G1))
=if( A2 = "", "", strHash(G2))
=if( A3 = "", "", strHash(G3))

A列包含主键。如果数组公式没有找到PK,那么它应该只写一个零长度的字符串。

单元格G1连接A到F列:

=ARRAYFORMULA(if( A1:A1000 = "", "", (A1:A1000 & B1:B1000 & C1:C1000 & D1:D1000 & E1:E1000 & F1:F1000)))

我的用户定义公式 strArrayHash 在我第一次使用它时非常简单且非常快:

function strHash(valCell) {
  var hash = 0;
  if (valCell.length == 0) return hash;
  for (i = 0; i < valCell.length; i++) {
    char = valCell.charCodeAt(i);
    hash = ((hash<<5)-hash)+char;
    hash = hash & hash; // Convert to 32bit integer
  }

  return hash;
}

function strArrayHash(range) {
  var ret = new Array();
  var str = "";
  for (item in range) {
    str = range[item].toString();
    if (str.length > 0) {
      ret[item] = strHash(str);
    } else {
      ret[item] = "";
    }
  };
  return ret;
}

我找到解决问题的唯一方法是手动进入并以某种方式编辑公式。

我以为我通过添加睡眠状态来实现它...

if (str.length > 0) {
  ret[item] = strHash(str);
  Utilities.sleep(10);  // circumvent undocumented execution limit
} else {

...但它仅适用于添加睡眠状态的用户。共享访问用户仅看到“正在加载...”,即使最后一个要编辑的用户正在查看计算的哈希值。

任何人都可以在电子表格关闭时提出停止工作的原因吗?我该怎么办呢。

1 个答案:

答案 0 :(得分:0)

我似乎已经解决了这个问题。

我意识到,如果我的电子表格中只有很少的电话,那就很愉快。超过两三个,它会开始吓坏。

由于一个非常简单的解决方案,我似乎又回来了;我在数组处理包装器中添加了一个简短的睡眠...

function strArrayHash(range) {
  var ret = new Array();
  var str = "";
  for (item in range) {
    str = range[item].toString();
    if (str.length > 0) {
      ret[item] = strHash(str);
      Utilities.sleep(10);  // circumvent undocumented execution limit
    } else {
      ret[item] = "";
    }
  };
  return ret;
}