使用谷歌脚本错误将谷歌电子表格的范围获取到图像中

发布于 2025-01-15 19:14:50 字数 3666 浏览 0 评论 0原文

使用 Google 将 Google 电子表格的范围获取到图像中script

ZektorH 编写了一个脚本,将选定的单元格范围保存到 Google 云端硬盘作为 图像。我导入了脚本,并且我能够将图像保存到谷歌驱动器,但前提是所选范围中的所有单元格都有文本。否则我会收到此错误

“异常:对象 (SLIDES_APIxxxxxxxxxx_0) 没有文本。”

有没有办法避免所有单元格上都有文本?例如在合并单元格上

function onOpen(e) {
  //Create custom menu to export range to Slides.
  SpreadsheetApp.getUi()
      .createMenu('Custom Functions')
      .addItem('Export Range to Image Files', 'SelectedRangeToImage')
      .addToUi();
}


function SelectedRangeToImage() {
  var slide = RangeToSlides();
  var slideId = slide.getId();
  var images  = [];
  for (var x=0; x<slide.getSlides().length;x++) {
    var image = SlidesToImage(slide.getName()+x, slideId, slide.getSlides()[x].getObjectId());
    images.push(image);
  }

  //Show interface with links to all images
  var ui = SpreadsheetApp.getUi();
  var html = HtmlService.createHtmlOutput();
  html.append("<p>Your images:</p>");
  html.append("<ul>");
  for (var i=0; i<images.length; i++) {
    html.append("<li><a href='"+images[i].getUrl()+"'>"+images[i].getName()+"</a></li>");
  }
  html.append("</ul>");
  html.append("<input type='button' value='Close' onclick='google.script.host.close()' />");
  ui.showModalDialog(html, "Exporting results:");
}

function RangeToSlides() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getActiveRange();

  var rangeValues = range.getDisplayValues();
  var rangeHorizontalAlignments = range.getHorizontalAlignments()
  var rangeBackgrounds = range.getBackgrounds();
  var rangeFontWeights = range.getFontWeights();


  var sl = SlidesApp.create("ExportToImage"+new Date());
  var slide = sl.getSlides()[0];

  //Create table with size of the range
  var table = slide.insertTable(rangeValues.length, rangeValues[0].length);
  for (var x=0; x<rangeValues.length; x++) {
    for (var y=0; y<rangeValues[x].length; y++) {
      var cell = table.getCell(x,y);
      cell.getText().setText(rangeValues[x][y]); //Set text
      cell.getFill().setSolidFill(rangeBackgrounds[x][y]); //Set background
      cell.getText().getTextStyle().setBold(rangeFontWeights[x][y]=="bold"?true:false); //Set text formatting
      var alignment;
      switch(rangeHorizontalAlignments[x][y]) {
        case "general-left":
          alignment = SlidesApp.ParagraphAlignment.START;
          break;
        case "general-right":
          alignment = SlidesApp.ParagraphAlignment.END;
          break;
        case "center":
          alignment = SlidesApp.ParagraphAlignment.CENTER;
          break;
      }
      cell.getText().getParagraphStyle().setParagraphAlignment(alignment); //Set text alignment
    }
  }
  sl.saveAndClose();
  return sl;  
}

function SlidesToImage(name, presentationId, slideId) {
  var url = "https://slides.googleapis.com/v1/presentations/"+presentationId+"/pages/"+slideId+"/thumbnail";
  var options = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  var response = UrlFetchApp.fetch(url, options);
  var responseJson = JSON.parse(response.getContentText());
  var imageurl = responseJson.contentUrl;
  var imageResponse = UrlFetchApp.fetch(imageurl, options);
  var blob = imageResponse.getBlob();
  blob.setName(name);
  var resultingFile = DriveApp.createFile(blob);
  return resultingFile;
}

ZektorH 脚本如下

Get range of google spreadsheet into an image using google script

ZektorH wrote a script to save a selected range of cells to google drive as an image. I imported the script and Im able to save images to google drive but only if all the cells in the selected range have text. otherwise I get this error

"Exception: The object (SLIDES_APIxxxxxxxxxx_0) has no text."

Is there a way to avoid having text on all cells? for example on merged cells

function onOpen(e) {
  //Create custom menu to export range to Slides.
  SpreadsheetApp.getUi()
      .createMenu('Custom Functions')
      .addItem('Export Range to Image Files', 'SelectedRangeToImage')
      .addToUi();
}


function SelectedRangeToImage() {
  var slide = RangeToSlides();
  var slideId = slide.getId();
  var images  = [];
  for (var x=0; x<slide.getSlides().length;x++) {
    var image = SlidesToImage(slide.getName()+x, slideId, slide.getSlides()[x].getObjectId());
    images.push(image);
  }

  //Show interface with links to all images
  var ui = SpreadsheetApp.getUi();
  var html = HtmlService.createHtmlOutput();
  html.append("<p>Your images:</p>");
  html.append("<ul>");
  for (var i=0; i<images.length; i++) {
    html.append("<li><a href='"+images[i].getUrl()+"'>"+images[i].getName()+"</a></li>");
  }
  html.append("</ul>");
  html.append("<input type='button' value='Close' onclick='google.script.host.close()' />");
  ui.showModalDialog(html, "Exporting results:");
}

function RangeToSlides() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getActiveRange();

  var rangeValues = range.getDisplayValues();
  var rangeHorizontalAlignments = range.getHorizontalAlignments()
  var rangeBackgrounds = range.getBackgrounds();
  var rangeFontWeights = range.getFontWeights();


  var sl = SlidesApp.create("ExportToImage"+new Date());
  var slide = sl.getSlides()[0];

  //Create table with size of the range
  var table = slide.insertTable(rangeValues.length, rangeValues[0].length);
  for (var x=0; x<rangeValues.length; x++) {
    for (var y=0; y<rangeValues[x].length; y++) {
      var cell = table.getCell(x,y);
      cell.getText().setText(rangeValues[x][y]); //Set text
      cell.getFill().setSolidFill(rangeBackgrounds[x][y]); //Set background
      cell.getText().getTextStyle().setBold(rangeFontWeights[x][y]=="bold"?true:false); //Set text formatting
      var alignment;
      switch(rangeHorizontalAlignments[x][y]) {
        case "general-left":
          alignment = SlidesApp.ParagraphAlignment.START;
          break;
        case "general-right":
          alignment = SlidesApp.ParagraphAlignment.END;
          break;
        case "center":
          alignment = SlidesApp.ParagraphAlignment.CENTER;
          break;
      }
      cell.getText().getParagraphStyle().setParagraphAlignment(alignment); //Set text alignment
    }
  }
  sl.saveAndClose();
  return sl;  
}

function SlidesToImage(name, presentationId, slideId) {
  var url = "https://slides.googleapis.com/v1/presentations/"+presentationId+"/pages/"+slideId+"/thumbnail";
  var options = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  var response = UrlFetchApp.fetch(url, options);
  var responseJson = JSON.parse(response.getContentText());
  var imageurl = responseJson.contentUrl;
  var imageResponse = UrlFetchApp.fetch(imageurl, options);
  var blob = imageResponse.getBlob();
  blob.setName(name);
  var resultingFile = DriveApp.createFile(blob);
  return resultingFile;
}

ZektorH script below

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文