使用 Class CellImageBuilder 将图像导入 Google Sheets 单元格

Using Class CellImageBuilder to import Image into Google Sheets cell

2022 年 1 月 19 日,CellImageBuilderclass 被添加到 Google Sheets Spreadsheet 服务中。

此 class 现在允许您将图像导入 Google 表格中的单元格,以前您只能在单元格上方添加图像。

我一直在尝试使用这个新的 class 从 Google sheet 中获取 URL link,然后在URL 旁边的单元格。如果我可以将 URL 硬编码到脚本中(下面的示例)

,这将非常有效
**function insertImageIntoCell()**
    {
    var sheet = SpreadsheetApp.getActiveSheet();  
    
    var url='Google_Docs_Image_URL'
    
    let image = SpreadsheetApp.newCellImage().setSourceUrl(url).setAltTextDescription('TestImage').toBuilder().build();
    
SpreadsheetApp.getActive().getActiveSheet().getRange('C2').setValue(image);
    }

我遇到的问题是,一旦我创建了一个数组来遍历列,下面的脚本就会创建一个有效的数组并将其发布到正确的列和行中,但是当它发布回传播时sheet 它仅 returns URL 并且不会将其转换为单元格中的图像

**function insertImageIntoCell()**
{
var sheet = SpreadsheetApp.getActiveSheet();  
var myStringArray = sheet.getRange('B2:B10');
var myStringArray = sheet.getRange('B2:B10').getValues();

//Logger.log(myStringArray)
  
  let image = SpreadsheetApp.newCellImage().setSourceUrl(myStringArray).setAltTextDescription('test').toBuilder().build();

  SpreadsheetApp.getActive().getActiveSheet().getRange('C2:C10').setValues(myStringArray);
}

我使用以下代码创建初始 table 数据,这会从 Google 驱动器位置提取文件名和下载 URL,然后将其保存到 sheet

/* modified from @hubgit and  
for this stackexchange question http://webapps.stackexchange.com/questions/86081/insert-image-from-google-drive-into-google-sheets by @twoodwar
*/
function listFilesInFolder(folderName) {
   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(["Name","URL","Image"]);

//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById("Google_Drive_Folder");
    var contents = folder.getFiles();
    let image=[]; 

    var cnt = 0;
    var file;

    while (contents.hasNext()) {
        var file = contents.next();
        cnt++;
          data = [
                file.getName(),
                file.getDownloadUrl(),
            ];

            sheet.appendRow(data);
            
    };
};

我正在寻找脚本将文件信息从 Google 驱动器刷新到 sheets,然后将图像保存到单元格中,现在看来这个功能存在,但我无法让它获取 URL 的

数组
更新:
  • 此问题已归档。为 this issue 添加一颗星,以便 Google 开发人员优先解决此问题。
问题:
  • setValues() 不适用于 CellImage,而 setValue() 可以。

If/when 它开始工作,您需要使用 map 将每个值转换为 cellImage :

function insertImagesIntoCell() {
  const sheet = SpreadsheetApp.getActiveSheet(),
    range = sheet.getRange('B2:B10');
  range.setValues(
    range.getValues().map(url => [
      SpreadsheetApp.newCellImage()
        .setSourceUrl(url[0])
        .build(),
    ])
  );
}

建议

也许您可以尝试下面的示例实现。

示例调整脚本

function listFilesInFolder(folderName){
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow(["Name","URL","Image"]);

//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
  var folder = DriveApp.getFolderById("DRIVE_FOLDER_ID");
  var contents = folder.getFiles();
  let image=[]; 

  var cnt = 0;
  var file;

  while (contents.hasNext()) {
      var file = contents.next();
      cnt++;
        data = [
              file.getName(),
              file.getDownloadUrl(),
          ];

          sheet.appendRow(data);      
  };
  insertImageIntoCell(); //Insert the images on column C
};

function insertImageIntoCell(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = 1;
  sheet.getDataRange().getValues().forEach(url =>{
    if(url[1] == "URL")return row += 1;
      let image = SpreadsheetApp.newCellImage().setSourceUrl(url[1]).setAltTextDescription('TestImage').toBuilder().build();
      SpreadsheetApp.getActive().getActiveSheet().getRange('C'+row).setValue(image);
      row += 1;
  });
}

带有示例图像的示例驱动器文件夹

示例结果:

  • 在 运行 函数之后 listFilesInFolder: