Google Sheets - скрипт, который поддерживает форматирование гиперссылок при импорте в стиле importRange? - PullRequest
1 голос
/ 25 января 2020

В настоящее время я импортирую большой диапазон ячеек (2500 строк, 200 столбцов), используя скрипт basi c ниже. Около 20 из этих столбцов являются гиперссылками, форматирование которых я хотел бы сохранить, но в настоящее время теряю их при получении. Я уверен, что это потому, что getValues ​​может быть только типа Number, Boolean, Date или String. Кто-нибудь знает об обходном пути здесь?

function  importOnOpen() {
var values = SpreadsheetApp.openById('ABCDEFGHIJKLMNOPQRSTUVWXYZ').
  getSheetByName('exportSheet').getRange('A1:HZ2500').getValues();
  SpreadsheetApp.getActive().getSheetByName('importSheet').
  getRange(1,1,values.length,values[0].length).setValues(values);}

Один из вариантов - использовать getFormulas для указанных столбцов гиперссылок c, но, если это возможно, я бы хотел вообще не вставлять формулы в лист назначения. держать его быстрым. Выполнение отдельного вызова для каждого столбца гиперссылки кажется неуклюжим, хотя, думаю, я мог бы сгруппировать их вместе.

Моим предыдущим решением было вообще не использовать скрипт, а вместо этого использовать формулу importRange, которая работала просто отлично ( с другой стороны, обратите внимание, что функция «query» переносит ту же проблему потери форматирования). Моя проблема с importRange двоякая: 1) он получал данные полунепрерывно, что ухудшало производительность моей электронной таблицы, и 2) из-за проблем с «загрузкой ...», возникающих из-за размера вызова, который мне был нужен, чтобы разбить запрос на 5 отдельных запросов и сгруппировать их в arrayFormula, чтобы заставить его работать согласованно - это казалось неуклюжим.

Может ли другое возможное решение быть функцией setShowHyperlink (showHyperlink)? Понятия не имею, как это работает, и я не видел, чтобы кто-нибудь использовал это, поэтому я сомневаюсь в этом. Просто мысль. https://developers.google.com/apps-script/reference/spreadsheet/range#setShowHyperlink (логическое значение)

Спасибо за любую помощь!

1 Ответ

1 голос
/ 28 января 2020

Ответ:

Чтобы скопировать с одного листа на другой в той же электронной таблице, вы можете использовать метод Range.copyTo(destination, copyPasteType, transposed) с перечислителем PASTE_NORMAL для копирования как формул, так и текста. Для одной таблицы в другую можно использовать метод Sheet.copyTo().

в той же таблице:

Как вы уже поняли, getValues() может иметь только тип Number, Boolean, Date или String и объект формулы не считаются ни одним из них. getDisplayValues() также имеет ту же проблему в том, что он не может принять базовую формулу.

Изучив документацию для CopyPasteType s, вы можете увидеть, что с помощью перечислимых паст PASTE_NORMAL values, formulas, formats and merges.

Используя это, можно затем скопировать весь лист за один go, всего за пару вызовов:

function copyAllTheThings() {
  var ss = SpreadsheetApp.openById('<sheet-id>');

  var range = ss.getSheetByName('exportSheet')
                .getRange('A1:HZ2500');

  var importTo = ss.getSheetByName('importSheet')
                   .getRange(range.getA1Notation());

  range.copyTo(importTo, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}

Копирование из одной электронной таблицы на другой:

Если вы хотите импортировать лист из одной электронной таблицы в другую, вы можете использовать метод Sheet.copyTo(). Это скопирует весь лист, а не просто диапазон , но его можно использовать так, чтобы сохранить формат данных и формулы из листа, который нужно скопировать:

function  importOnOpen() {
  var otherSS = SpreadsheetApp.openById('<spreadsheet-id-to-copy-to>');

  var export = SpreadsheetApp.openById('<spreadsheet-id-to-copy-from>')
                             .getSheetByName('exportSheet');

  export.copyTo(otherSS);
}

Запрос на добавление:

К сожалению, если методы copyTo() слишком медленные из-за размера листа, вы мало что можете сделать с существующими функциями Sheets API и Apps Script.

Однако вы можете сообщить Google, что эта функция важна для API Sheets и вы хотели бы попросить их реализовать ее. Google Issue Tracker - это место, где разработчики могут сообщать о проблемах и делать запросы на функции для своих служб разработки.

Страница для запроса функции для API Google Sheets: здесь .

Надеюсь, это вам пригодится!

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...