Как видно из пользовательского интерфейса электронной таблицы, вы можете вставлять изображения двумя способами , предоставляя файл прямо с вашего 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-адрес не может быть угадан, поскольку содержит подпись.