Используйте пользовательскую формулу MD5 с ARRAYFORMULA - PullRequest
2 голосов
/ 08 марта 2019

Я реализовал формулу MD5, как упоминалось здесь: Хэш текста ячейки в Google Spreadsheet .

function MD5 (input) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
  Utilities.sleep(100)
  var txtHash = '';
  for (i = 0; i < rawHash.length; i++) {
    var hashVal = rawHash[i];
    if (hashVal < 0) {
      hashVal += 256;
    }
    if (hashVal.toString(16).length == 1) {
      txtHash += '0';
    }
    txtHash += hashVal.toString(16);
  }
  return txtHash;
}

Теперь я хочу запустить это с ARRAYFORMULA, но я могуне получается это работает.Я попробовал это:

=ARRAYFORMULA(({"FiBu MD5";IF(ISBLANK(AG2:AG),"",(MD5(O2:O)))}))

Я получаю ошибку:

"Невозможно преобразовать массив в (класс) []. (Строка 2)."

У кого-нибудь есть идеи, как это решить?

1 Ответ

0 голосов
/ 09 марта 2019

Как насчет этой модификации?

Например, когда используется текущий скрипт вашего вопроса, в случае, если MD5(O2:O) используется в качестве пользовательской функции, input из function MD5(input) {} равно 2размерный массив типа [[value of O2], [value of O3],,,].Но в вашем скрипте результат возвращается путем ввода значения, которое не является массивом.При этом возникает ошибка, указанная в вашем вопросе.Таким образом, для ввода и вывода массива необходимо изменить скрипт для этой ситуации следующим образом.

Модифицированный скрипт:

function MD5(input) {
  for (var i = input.length - 1; i >= 0; i--) {
    if (input[i][0]) {
      input.splice(i + 1);
      break;
    }
  }
  var result = input.map(function(e) {
    if (e[0] != "") {
      var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, e[0]);
  //    Utilities.sleep(100) // I thought that this might be not required.
      var txtHash = '';
      for (i = 0; i < rawHash.length; i++) {
        var hashVal = rawHash[i];
        if (hashVal < 0) {
          hashVal += 256;
        }
        if (hashVal.toString(16).length == 1) {
          txtHash += '0';
        }
        txtHash += hashVal.toString(16);
      }
      return [txtHash];
    }
    return [];
  });
  return result;
}

Примечание:

  • Я думаю, что с помощью вышеуказанной модификации вы также можете использовать формулу ={"FiBu MD5";MD5(O2:O)} вместо =ARRAYFORMULA(({"FiBu MD5";IF(ISBLANK(AG2:AG),"",(MD5(O2:O)))})).

Если это не сработало, я прошу прощения.В то время, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образец электронной таблицы?По этому я хотел бы изменить скрипт.

...