ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант

Как вставить картинку непосредственно в ячейку Google Spreadsheets?

Добрый день. Недавно понадобилась функция генерации QR кода в Google таблицах. Сделал так:
function getQR(text, size){
  size = (size || 200) + "";
  const apiURL = "https://api.qrserver.com/v1/create-qr-code/?size="+size+"x"+size+"&data="+text;
  let result = UrlFetchApp.fetch(apiURL);
  return result.getBlob().getAs("image/png");
};

но картинка в ячейке не появляется, хотя url строится валидный и сервер отдаёт png картинку.
Я, конечно потом сделал через IMAGE(), но всё-таки засел вопрос в голове, т.к. периодически нужно делать подобное. LaTeX формулы или свою диаграмму, например.
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Sheets
Google Products Expert
Сам процесс вставки картинки довольно специфический и может потребовать определенных навыков. Поэтому я приведу уже готовый пример, основанный на публичном коде. Все это работает не очень быстро, поэтому вам необходимо задуматься о заранее подготовленных картинках и куда вы их будете вставлять. Порции функции такие: на один лист массив из картинок с координатами. Т.е. на один лист можно сразу добавить несколько картинок. Это будет самым оптимальным способом именно из-за специфики вставки.

Функция вставки
/**
 * Insert a single image to the cell. A1 is default
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
 * @param {GoogleAppsScript.Base.Blob} blob
 * @param {number} row
 * @param {number} column
 */
function insertImageBlobToCell_(sheet, blob, row = 1, column = 1) {
  const sheetName = sheet.getName();
  const parentId = sheet.getParent().getId();
  return DocsServiceApp.openBySpreadsheetId(parentId)
    .getSheetByName(sheetName)
    .insertImage([{ blob, range: { row, column } }]);
}


Пример вызова
/**
 * Insert an image blob to the cell
 */
function userActionRun() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const blob = UrlFetchApp.fetch(
    'https://contributor.pw/img/post/sheets/sheets_mmult-some-uses-cases_01.png'
  ).getBlob();
  insertImageBlobToCell_(sheet, blob);
}


Результат
601a1d24dca43655873570.png

Не забудьте добавить библиотеку
108j6x_ZX544wEhGkgddFYM6Ie09edDqXaFwnW3RVFQCLHw_mEueqUHTW
в свой проект. Пример манифеста в сниппете
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы