如何在单元格中获取图像的图像ID?

发布于 2025-01-20 21:54:17 字数 3185 浏览 1 评论 0原文

我目前正在 Google Apps 脚本中编写代码,该代码允许用户填写电子表格并让电子表格为招聘板生成打印输出。我正在尝试以一种用户可以简单地将徽标图像插入到我的 Google 工作表的一行中并让它替换我的文档模板中的占位符的方式进行设计。 我找到了很多关于如何获取图像并将其转换为 blob 并从 url 或 ID 插入它的答案,但是,我似乎找不到从图像中获取 ID 或 url 的方法细胞。 这是我目前的代码:

//Creates menu option on spreadsheet
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu('AutoFill Docs');
  menu.addItem('Create New Docs', 'createNewGoogleDocs');
  menu.addToUi();

}

//Defines where to get template and info from
function createNewGoogleDocs() {
 
  const googleDocTemplate = DriveApp.getFileById('14MJNd37pn6D-EmNKCQzXXvxJCcOAoB3KS-TlDgZuWMI');
  const destinationFolder = DriveApp.getFolderById('120Sb_CJJlmz5NzJW8W3DB4TNuC4kdD3e');
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('JobBoard');
  const rows = sheet.getDataRange().getValues();
  
  rows.forEach(function(row, index) {
    if (index === 0) return;
    if (row[9]) return;
    const copy = googleDocTemplate.makeCopy(`${row[1]}, ${row[0]} Printout`, destinationFolder);
    const doc = DocumentApp.openById(copy.getId())
    const body = doc.getBody();
    const friendlyDate = new Date(row[2]).toLocaleDateString();

//Replacing text
    body.replaceText('{{Company}}', row[1]);
    body.replaceText('{{jobTitle}}', row[0]);
    body.replaceText('{{datePosted}}', friendlyDate);
    body.replaceText('{{Description}}', row[3]);
    body.replaceText('{{Qualifications}}', row[5]);
    body.replaceText('{{Wage}}', row[4]);
    body.replaceText('{{Apply}}', row[6]);

//A subfunction to handle replacing the image
  function textToImage() {
  var replaceTextToImage = function(body, searchText, image, width) {
    var next = body.findText(searchText);
    if (!next) return;
    var r = next.getElement();
    r.asText().setText("");
    var img = r.getParent().asParagraph().insertInlineImage(0, image);
    if (width && typeof width == 100) {
      var w = img.getWidth();
      var h = img.getHeight();
      img.setWidth(width);
      img.setHeight(width * h / w);
    }
    return next;
  };

  var documentId = doc;
  var replaceText = "{{Upload Image}}";
  var imageFileId = "### File ID of image ###"; //I don't know how to get this variable
  var body = DocumentApp.openById(documentId).getBody();
  var image = DriveApp.getFileById(imageFileId).getBlob();
  do {
    var next = replaceTextToImage(body, replaceText, image, 200);
  } while (next);
}

//Close and saves new doc
    doc.saveAndClose();
    const url = doc.getUrl();
    sheet.getRange(index + 1, 10).setValue(url)
    
  })

}

我认为可能让我困惑的是我现在必须循环遍历所有单元格,以便我可以一次创建多个文档(意味着每一行将有不同的文档和不同的图像 ID)。我只是不确定如何解决这个问题。

以下是模板和电子表格

https://docs.google.com/spreadsheets/d/1cySHogAxcUgzr0hsJoTyPZakKQkM6uIOtmyPzcMoJUM/edit?usp=sharing

https://docs.google.com/document/d/14MJNd37pn6D-EmNKCQzXXvxJCcOAoB3KS-TlDgZuWMI/edit?usp=sharing

I'm currently working on a code in Google Apps Script that allows a user to fill out a spreadsheet and have the spreadsheet generate printouts for a job board. I'm trying to design this in a way where the user can simply insert a logo image into a row of my Google sheet and have it replace a placeholder in my doc template.
I have found lots of answers about how you can take an image and convert it to a blob and insert it from a url or an ID, however, I can't seem to find a way to get the ID or url from the image in the cell.
Here's my code currently:

//Creates menu option on spreadsheet
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu('AutoFill Docs');
  menu.addItem('Create New Docs', 'createNewGoogleDocs');
  menu.addToUi();

}

//Defines where to get template and info from
function createNewGoogleDocs() {
 
  const googleDocTemplate = DriveApp.getFileById('14MJNd37pn6D-EmNKCQzXXvxJCcOAoB3KS-TlDgZuWMI');
  const destinationFolder = DriveApp.getFolderById('120Sb_CJJlmz5NzJW8W3DB4TNuC4kdD3e');
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('JobBoard');
  const rows = sheet.getDataRange().getValues();
  
  rows.forEach(function(row, index) {
    if (index === 0) return;
    if (row[9]) return;
    const copy = googleDocTemplate.makeCopy(`${row[1]}, ${row[0]} Printout`, destinationFolder);
    const doc = DocumentApp.openById(copy.getId())
    const body = doc.getBody();
    const friendlyDate = new Date(row[2]).toLocaleDateString();

//Replacing text
    body.replaceText('{{Company}}', row[1]);
    body.replaceText('{{jobTitle}}', row[0]);
    body.replaceText('{{datePosted}}', friendlyDate);
    body.replaceText('{{Description}}', row[3]);
    body.replaceText('{{Qualifications}}', row[5]);
    body.replaceText('{{Wage}}', row[4]);
    body.replaceText('{{Apply}}', row[6]);

//A subfunction to handle replacing the image
  function textToImage() {
  var replaceTextToImage = function(body, searchText, image, width) {
    var next = body.findText(searchText);
    if (!next) return;
    var r = next.getElement();
    r.asText().setText("");
    var img = r.getParent().asParagraph().insertInlineImage(0, image);
    if (width && typeof width == 100) {
      var w = img.getWidth();
      var h = img.getHeight();
      img.setWidth(width);
      img.setHeight(width * h / w);
    }
    return next;
  };

  var documentId = doc;
  var replaceText = "{{Upload Image}}";
  var imageFileId = "### File ID of image ###"; //I don't know how to get this variable
  var body = DocumentApp.openById(documentId).getBody();
  var image = DriveApp.getFileById(imageFileId).getBlob();
  do {
    var next = replaceTextToImage(body, replaceText, image, 200);
  } while (next);
}

//Close and saves new doc
    doc.saveAndClose();
    const url = doc.getUrl();
    sheet.getRange(index + 1, 10).setValue(url)
    
  })

}

I think what might be messing me up is that I have to loop through all my cells right now so that I can create multiple documents at once (meaning each row will have a different doc and different image ID). I'm just not sure how to work around that.

Here's the template and spreadsheet

https://docs.google.com/spreadsheets/d/1cySHogAxcUgzr0hsJoTyPZakKQkM6uIOtmyPzcMoJUM/edit?usp=sharing

https://docs.google.com/document/d/14MJNd37pn6D-EmNKCQzXXvxJCcOAoB3KS-TlDgZuWMI/edit?usp=sharing

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

污味仙女 2025-01-27 21:54:17

尝试在特定单元格中获取图像时存在一些问题。甚至还有一个功能请求。今年,Google 发布了一些图像管理类,但似乎有< a href="https://issuetracker.google.com/issues/215575446?pli=1" rel="nofollow noreferrer">检索这些内容时出现的问题使用 cellImage 类。

我找到了相关的答案(解决方法)来自用户 @Tanaike,其中图像从 Google 表格中检索,转换为 Blob 并插入到 Google 中博士。

提供的示例代码是:

const spreadsheetId = "###"; // Google Spreadsheet ID
const res = DocsServiceApp.openBySpreadsheetId(spreadsheetId).getSheetByName("Sheet1").getImages();
console.log(res); // You can check the retrieved images at the log.
if (res.length == 0) return;
const blob = res[0].image.blob; // Here, 1st image of Sheet1 is retrieved. Of course, you can choose the image on the sheet.

let doc = DocumentApp.create("newDocName Goes_Here");
var body = doc.getBody();
var imgPDF = body.appendImage(blob);

考虑到要完成上述工作,您需要:

  1. 安装 Google Apps 脚本库。 (说明此处
  2. 启用 Drive API。

我对此进行了测试,确实从给定的工作表中获取了图像并将它们插入到指定的 Google 文档中。由于某种原因,运行您的代码没有向我显示从模板新创建的文件,但您可以根据您的情况相应地调整上述内容。

There is a bit of an issue trying to get an image in a specific cell. There's even a Feature Request for that. This year Google released a few classes for image management but there seems to be issues when retrieving those using cellImage class.

I found a related answer (workaround) from user @Tanaike where images are retrieved from Google Sheets, converted to a Blob and inserted into a Google Doc.

Sample code provided was:

const spreadsheetId = "###"; // Google Spreadsheet ID
const res = DocsServiceApp.openBySpreadsheetId(spreadsheetId).getSheetByName("Sheet1").getImages();
console.log(res); // You can check the retrieved images at the log.
if (res.length == 0) return;
const blob = res[0].image.blob; // Here, 1st image of Sheet1 is retrieved. Of course, you can choose the image on the sheet.

let doc = DocumentApp.create("newDocName Goes_Here");
var body = doc.getBody();
var imgPDF = body.appendImage(blob);

Take into consideration that to make the above work you need to:

  1. Install Google Apps Script library. (instructions here)
  2. Enable Drive API.

I tested this and indeed, got the images from the given sheet and inserted them into the Google Doc specified. For some reason, running your code did not show me a newly created file from the template but you can tweak the above accordingly to your case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文