Хранение (или передача) ссылки Element / TableCell во время обхода сервер-клиент - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь создать модальное всплывающее окно, которое выполняет некоторую работу с данной ячейкой таблицы в Документе Google, используя HTMLService и GAS.

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

Подход 1. Если я передаю его непосредственно клиенту и обратно,ссылка не работает, потому что к моменту получения клиентом она составляет null.Я могу передать содержимое ячейки точно в том же контексте, так что строки работают, это просто факт, что это ссылка на ячейку.(Имеет смысл.)

Подход 2: Если я сохраню ссылку TableCell в глобальной переменной на стороне сервера, я получу Cannot call method "getText" of undefined - ссылка не определена после первого обхода.(Я предполагаю, что серверный скрипт полностью перезагружается в это время.)

Подход 3: Если я использую CacheService.getUserCache () на стороне клиента, когда я пытаюсь получить мой кэшированный объект TableCell, он кажется отключенным оттот, который я установил, потому что я получаю ранее непонятную ошибку Cannot find function getText in object TableCell.

// server, before popup is opened:
cache.put('cell_currently_being_edited', active_doc.getCursor().getElement().getParent());

// popup client calls server function like so:
google.script.run.withSuccessHandler(load_content).get_starting_content();

// server, where the above error occurs:

function get_starting_content() {
    var cell_currently_being_edited = cache.get('cell_currently_being_edited');
    return cell_currently_being_edited.getText();
}

Если бы ячейки имели какое-то фиксированное значение ID, которое я мог бы передать, это могло бы сработать ...

Я бы сделал это на основе текста в ячейке, но я надеюсь, что это не единственный вариант, потому что текст ячейки в целом (и да, в этом конкретном контексте тоже) может быть не уникальным, поэтому после прохождения туда и обратно я могу оказатьсязамена текста в другой ячейке, отличной от того, в котором находился курсор, когда пользователь активирует всплывающее окно.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Поскольку другой ответ (даже после изменения кода) был сосредоточен на «сохранении» половины проблемы, я подумал, что поделюсь кодом, который включает в себя, как впоследствии загрузить ссылку для завершения туда-обратно:

// save

var table_cell = active_doc.getCursor().getElement().getParent();
var table_row = table_cell.getParentRow();
var table = table_row.getParentTable();
var column_index = table_row.getChildIndex(table_cell);
var table_index = active_doc.getBody().getChildIndex(table);
var row_index = table.getChildIndex(table_row);
cache.put('table_currently_being_edited', table_index);
cache.put('row_currently_being_edited', row_index);
cache.put('column_currently_being_edited', column_index);

// load

function get_cell_currently_being_edited() {
    var table_index = cache.get('table_currently_being_edited');  
    var row_index = cache.get('row_currently_being_edited');
    var column_index = cache.get('column_currently_being_edited');
    return active_doc.getBody().getChild(table_index).getCell(row_index, column_index);  
}
0 голосов
/ 05 октября 2018

Решение:

  • Вы можете использовать индекс ячейки в качестве уникального идентификатора для передачи строки RC туда и обратно между клиентом и сервером, поскольку строковые значения допустимы.
  • Используйте Свойства / Служба кэширования для хранения информации об индексе RC в виде строки для последующего извлечения на сервере, если это необходимо.

Пример сценария:

function getRCTIndexOfTable(tableCell) {
  var tableRow = tableCell.getParentRow();
  var table = tableRow.getParentTable();
  var column = tableRow.getChildIndex(tableCell);
  var row = table.getChildIndex(tableRow);
  var body = table.getParent().asBody();
  var tableId = body.getChildIndex(table);
  return 'R' + row + 'C' + column + 'T' + tableId;
}

function main() {
  var active_doc = DocumentApp.getActiveDocument();
  var activeTableCell = active_doc
    .getCursor()
    .getElement()
    .getParent()
    .asTableCell();
  Logger.log(getRCTIndexOfTable(activeTableCell));
}

Ссылки:

...