将图像单元格从excel导入Google工作表

lb3vh1jj  于 2022-12-30  发布在  Go
关注(0)|答案(1)|浏览(447)

我正在尝试从Excel导入一些产品数据到Google工作表。Excel中有一些图片。如果我简单地复制和粘贴图片将丢失。使用Google工作表的导入功能,图片将出现在Google工作表中,就像它们在Excel中一样。
不过,大部分图片都是“在细胞上方”。我希望它们是“在细胞中”,这样以后更容易操纵图片。
我不知道为什么有些产品图片在谷歌工作表中显示为“在单元格中”。下面的截图来自Excel,两张选中的图片以相同的方式插入Excel:

这是Google Sheet的截图:

你可以在最后一行看到图片是“在单元格中”。如果有一种方法可以确保图片在导入后是“在单元格中”,我的问题就解决了。但我不知道如何解决。
所以我在想如果我可以用App Script来做到这一点,我能想到的步骤是:
1.循环图像
1.如果它们“在单元格上方”,则检测它们在哪个单元格上方
1.将图像放入单元格
这可能吗?
我的数据示例:https://docs.google.com/spreadsheets/d/1OtlQNu7cKelnXBJk2gdCXHJkT0ixNugXfaBkQfQzxto/edit?usp=sharing

d7v8vwbk

d7v8vwbk1#

问题和解决方法:

遗憾的是,现阶段还没有一个内置的方法可以直接使用Google Apps Script来检索单元格中的图像,所以,在这种情况下,我想建议使用DocsServiceApp(作者:me)的Google Apps Script库。使用此库时,可以检索单元格中的图像,还可以确认图像是放在单元格上还是放在单元格中。使用此库作为实现目标的示例脚本时,下面的示例脚本如何?

用法:

1.安装谷歌应用程序脚本库。

请安装Google Apps脚本库的DocsServiceApp。您可以在此处查看如何安装它。

2.启用驱动器API。

请在高级Google服务中启用驱动器API。

3.准备示例脚本。

请将以下脚本复制并粘贴到示例电子表格的脚本编辑器中。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const obj = DocsServiceApp.openBySpreadsheetId(ss.getId()).getSheetByName("test").getImages();
  const sheet = ss.getSheetByName("test");
  obj.forEach(o => {
    if (!o.image.innerCell) {
      const temp = DriveApp.createFile(o.image.blob);
      const link = Drive.Files.get(temp.getId()).thumbnailLink.replace("=s220", "=s1000");
      sheet.getRange(o.range.a1Notation).setValue(SpreadsheetApp.newCellImage().setSourceUrl(link).build());
      temp.setTrashed(true);
    }
  });
  sheet.getImages().forEach(e => e.remove());
}
  • 运行此脚本时,单元格上的图像将放入单元格中。

备注:

  • 我测试了我的脚本使用您提供的样本电子表格。如果您改变您的电子表格,这个脚本可能无法使用。请小心这一点。

参考:

添加:

从你下面的答复中,
它在我的测试表上工作。但是当我试图在我的实际表上运行它时,我遇到了这个错误:
虽然,很遗憾,我不能复制你的情况,从你的错误消息,我添加了一个样本脚本猜测你的当前情况。你能确认吗?

示例脚本:

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ssId = ss.getId();
  const tempSS = DriveApp.getFileById(ssId).makeCopy("temp");
  const obj = DocsServiceApp.openBySpreadsheetId(tempSS.getId()).getSheetByName("test").getImages();
  const sheet = ss.getSheetByName("test");
  obj.forEach(o => {
    if (!o.image.innerCell) {
      const temp = DriveApp.createFile(o.image.blob);
      const link = Drive.Files.get(temp.getId()).thumbnailLink.replace("=s220", "=s1000");
      sheet.getRange(o.range.a1Notation).setValue(SpreadsheetApp.newCellImage().setSourceUrl(link).build());
      temp.setTrashed(true);
    }
  });
  sheet.getImages().forEach(e => e.remove());
  tempSS.setTrashed(true);
}

相关问题