Скрипт Google Apps для перемещения курсора к последнему месту редактирования теперь не работает - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть какой-то код, который я прекрасно использовал в течение нескольких месяцев, и он неожиданно завершился неудачей. Код переводит google sheet go в последнюю отредактированную ячейку после открытия.

function onEdit(e) {

var ss = e.source
var sheet = ss.getActiveSheet();
var cell = ss.getActiveCell();
var row = cell.getRow();
var column = cell.getColumn();
var sheet_name = sheet.getSheetName();
var scriptProperties = PropertiesService.getScriptProperties();

scriptProperties.setProperty('row',row);
scriptProperties.setProperty('column',column);
scriptProperties.setProperty('sheet name',sheet_name);
}

function onOpen(e) {

var properties = PropertiesService.getScriptProperties();

var ss = e.source;
var sheet_name = properties.getProperty('sheet name');
var sheet = ss.getSheetByName(sheet_name);
var row = properties.getProperty('row');
var column = properties.getProperty('column');
var cell = sheet.getRange(row,column);

ss.setActiveSheet(sheet);
ss.setActiveRange(cell);
}

Когда я просматриваю журнал Failed Execution, я вижу это:

Feb 29, 2020, 7:43:12 Исключение ошибки: невозможно преобразовать '10 .0' в int. at onOpen (Код: 26: 18)

Что-то изменилось на бэкэнде Google, что делает мой код недействительным?

1 Ответ

1 голос
/ 29 февраля 2020

Проблема

Передача типа String в метод, который ожидает Number в качестве аргумента.

Объяснение

Сообщение об ошибке довольно очевидно: a String "10.0" не может быть преобразовано в Integer. Вы случайно не перешли на новую среду выполнения V8? Проблема легко подтверждается, этот пример приведет к точно такой же ошибке:

function testStringToIntError() {
  const ss = SpreadsheetApp.openById('spreadsheet id');
  const sh = ss.getSheetByName('4');

  const store = PropertiesService.getScriptProperties();

  const propName = 'testStrToInt';

  store.setProperty(propName, '10.0');

  const res = store.getProperty(propName);

  sh.getRange(res,1);

  Logger.log(res);
}

Решение

Я бы предложил убедиться, что row имеет введите Number, явно преобразовав его в + или parseInt(), и это будет работать просто отлично.

Примечания

  1. Не знаете, почему это работал на тебя раньше. UPD : действительно, после повторного тестирования образца в Rhino среда выполнения допускает несоответствие типов, поэтому скрипт работал раньше, но останавливался сейчас.
  2. PropertiesService сохраняет данные как String s, поэтому вы всегда должны готовить его правильно, когда используете setProperty() или getProperty() (например, JSON.stringify() -> JSON.parse() для объектов и т. д. c).

Ссылка

  1. getRange() метод ссылка
  2. Properties направляющая (привязано к разделу формата данных)
...