Google Apps Script - вставьте изображение в ячейку электронной таблицы, используя идентификатор Google Drive - PullRequest
1 голос
/ 29 марта 2020

Как видно из пользовательского интерфейса электронной таблицы, вы можете вставлять изображения двумя способами , предоставляя файл прямо с вашего Google Диска

Выберите, чтобы разместить изображение в ячейке или более клетки. Ячейки с изображением также не могут иметь текст.

, но из AppsScript я не могу выполнить режим "in the cell".

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

Вставка изображения непосредственно в ячейку в программным путем, единственный способ, который я нашел, - это использование =IMAGE() формула , но в этом случае необходим общедоступный c URL.

Это решение, которое я до сих пор придумал :

function getCdnImageUrl_(driveFile) {
  // https://stackoverflow.com/a/59537829
  let imageUrl = "https://docs.google.com/uc?id=" + driveFile.getId();
  console.info("Access to embeddable link %s", imageUrl);

  // Retrieve url of cdn disabling redirects
  let fetchResponse = UrlFetchApp.fetch(imageUrl, {
    followRedirects: false
  });

  // Access to 302 header "Location"
  let cdnUrl = fetchResponse.getAllHeaders()["Location"]
  console.info("CDN URL %s", cdnUrl);

  return cdnUrl;
}

function insertImageAsFormula_(range, driveFile) {
  // Retrieve url
  let url = getCdnImageUrl_(driveFile);

  // Set formula
  range.setFormula("=IMAGE(\"" + url + "\")");
}


function main() {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getActiveSheet();
  let range = sheet.getRange("A1");

  let driveImageId = "my-drive-image-id";
  let driveFile = DriveApp.getFileById(driveImageId);

  // Set file as publicly available so CDN url will be callable for anonymous users
  driveFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

  // Retrieve url from CDN and set as formula
  insertImageAsFormula_(range, driveFile);

  // Force Spreadsheet to update view (download the image) otherwise when the file will be restored to "private" the link will provide HTTP 403
  SpreadsheetApp.flush();

  // Restore previous sharing access
  driveFile.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.VIEW);
}

Как только Spreadsheet загрузил изображение, я обнаружил, что нет проблем, если возвращенный использованный URL-адрес аутентифицирован, поскольку изображение уже загружено и отображается.

Можете ли вы подтвердить, что в данный момент нет прямого способа использовать AppsScript для добавления изображения внутри ячейки? Я не очень рад, что мне нужно сделать файл publi c (даже если на короткий промежуток времени), есть ли у вас какие-либо предложения о том, как выполнить ту же самую операцию, поддерживая файл закрытым?


РЕДАКТИРОВАТЬ

В итоге я загрузил файл с Google Диска в Google Cloud Storage, чтобы создать подписьUrl Загрузить файл в GCS Создать подписьUrl

При таком подходе файл диска остается закрытым, сгенерированный URL-адрес автоматически истекает после настроенного TTL, а сам URL-адрес не может быть угадан, поскольку содержит подпись.

1 Ответ

1 голос
/ 30 марта 2020

Можете ли вы подтвердить, что в данный момент нет прямого способа использовать AppsScript для добавления изображения внутри ячейки?

Ответ:

Я абсолютно могу это подтвердить.

Дополнительная информация:

Поскольку добавление изображений в ячейки без использования формулы =IMAGE было добавлено в Google Sheets в марте 2019 и поэтому на момент написания этого поста в настоящее время нет способа сделать это с помощью Apps Script или API.

Тем не менее, уже есть отчет о системе отслеживания проблем Google, который запрашивает это, опубликованный 27 th март 2019:

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

Надеюсь, это полезно для вас!

Ссылки:

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