Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何将图元转换为与第一个选定图元相同的大小?_Google Apps Script_Resize_Google Slides - Fatal编程技术网

Google apps script 如何将图元转换为与第一个选定图元相同的大小?

Google apps script 如何将图元转换为与第一个选定图元相同的大小?,google-apps-script,resize,google-slides,Google Apps Script,Resize,Google Slides,我想将所有元素的大小设置为第一个选定元素的大小。但我的代码似乎有点问题,第一个元素的大小对其他元素不起作用 请参阅所附的脚本 /* * Make all elements same size */ function sameSizeElements() { var selection = SlidesApp.getActivePresentation().getSelection(); var selectionType = selection.getSelectionType();

我想将所有元素的大小设置为第一个选定元素的大小。但我的代码似乎有点问题,第一个元素的大小对其他元素不起作用

请参阅所附的脚本

/*
 * Make all elements same size
 */
function sameSizeElements() {
  var selection = SlidesApp.getActivePresentation().getSelection();
  var selectionType = selection.getSelectionType();
  var pageElements = selection.getPageElementRange().getPageElements();
  
  //iterate the selected page elements to grab the values of each positiion
  for (var i = 0; i < pageElements.length; i++) {
  
    if(i != 0){
      pageElements[i].setWidth(pageElements[0].getWidth());
      pageElements[i].setHeight(pageElements[0].getHeight());
    }
  }   
}
/*
*使所有元素大小相同
*/
函数sameSizeElements(){
var selection=SlidesApp.getActivePresentation().getSelection();
var selectionType=selection.getSelectionType();
var pageElements=selection.getPageElementRange().getPageElements();
//迭代所选页面元素以获取每个位置的值
对于(var i=0;i
下面是您可以放入ScriptEditor>code.js默认文件并刷新幻灯片的选项。它将按照您想要调试的方式工作

已更新

我们正在与谷歌应用程序脚本问题跟踪团队进行讨论-


作为当前的解决方法,该方法如何

问题和解决方法: 不幸的是,在现阶段,这一问题似乎仍未解决。这样,在您的情况下,无法检索第一个选定的图像。我认为这是你目前问题的原因

为了实现您的目标,作为当前的解决方案,我想提出以下流程

  • 选择用作基本大小的图像,然后运行脚本。
    • 图像的对象ID将保存到PropertiesService
  • 选择要调整大小的图像,然后运行脚本
  • 当为该流修改脚本时,它将变成如下所示

    修改脚本:
    函数所有菜单(){
    var slideUi=SlidesApp.getUi();
    slideUi.createMenu('LAK')
    .addSeparator()
    .add子菜单(slideUi.createMenu('size'))
    .addItem('选择基本图像','选择基本图像')//已添加
    .addItem('Same Size','sameSizeElements'))
    .addToUi();
    }
    // 1. 首先,它保存一个用作基础图像的图像。
    函数selectBaseImage(){
    var selection=SlidesApp.getActivePresentation().getSelection();
    var pageElements=selection.getPageElementRange().getPageElements();
    如果(pageElements.length==1){
    PropertiesService.getScriptProperties().setProperty(“baseImage”,pageElements[0]。getObjectId());
    }否则{
    抛出新错误(“选择一个图像”);
    }
    }
    // 2. 下一步,将使用保存的图像调整选定图像的大小。
    函数sameSizeElements(){
    var prop=PropertiesService.getScriptProperties();
    var objectId=prop.getProperty(“baseImage”);
    如果(objectId!=“”){
    var selection=SlidesApp.getActivePresentation().getSelection();
    var baseImage=selection.getCurrentPage().getPageElementById(objectId);
    var pageElements=selection.getPageElementRange().getPageElements();
    对于(var i=0;i
    结果:

    参考资料:

    问题的附加上下文:

    调用服务器端函数时,将
    ctx
    对象发送到
    /invoke
    端点,该端点除其他信息(会话id
    ssid
    、文档id
    docId
    、修订号
    rev
    、应用程序类型
    app
    )外,包含有关属性值中当前选定的
    PageElement
    s的数据,键为
    sel

    值是字符串和数字数组的数组,其中只有一个元素包含字符串-如果仔细观察,这些字符串是按选择顺序排列的对象ID(可以使用方法确认)

    至少这证实了选择的顺序是可以遵守的,但是上面提到的列表在服务器端的管理方式改变了顺序。不幸的是,我无法确认元素(除了形式为
    g8edc62556\u 0\u 0
    的ID分组)如何通过
    返回的任何特定顺序。getSelection().getPageElementRange().getPageElements()
    方法链:


    您可以分享一个测试演示文稿示例吗?以下是您可以放入ScriptEditor->code.js默认文件并刷新幻灯片的完整代码。它将按照您想要调试的方式工作。谢谢@RafaGuillermo@OlegValter“此项目在Chrome V8支持的新应用程序脚本运行时上运行。”@puzzdboy-谢谢,我们之前与Tanaike讨论过这个问题-这是两个运行时常见的不一致性-在服务器端对所选元素的解释中存在错误,你没有做错什么。我想我们可能会为此打开一个bug问题或FR谢谢你的最佳解决方案,抱歉,我不能将其分为两个步骤。“我将从你的最佳实践中学习。”困惑的男孩谢谢你的回答。很抱歉,我的建议与您期望的方向不同。谢谢。您是否可以与他人分享您的代码,您已经给出了这个强有力的技术答案。
    function allMenu(){
      var slideUi = SlidesApp.getUi();
      slideUi.createMenu('LAK')
          .addSeparator()
          .addSubMenu(slideUi.createMenu('Sizes')
          .addItem('Select base image', 'selectBaseImage')  // Added
          .addItem('Same Size', 'sameSizeElements'))
          .addToUi();
    }
    
    // 1. At first, it saves an image which is used as the base image.
    function selectBaseImage() {
      var selection = SlidesApp.getActivePresentation().getSelection();
      var pageElements = selection.getPageElementRange().getPageElements();
      if (pageElements.length == 1) {
        PropertiesService.getScriptProperties().setProperty("baseImage", pageElements[0].getObjectId());
      } else {
        throw new Error("Select one image.");
      }
    }
    
    // 2. As the next step, the selected images are resized using the saved image.
    function sameSizeElements() {
      var prop = PropertiesService.getScriptProperties();
      var objectId = prop.getProperty("baseImage");
      if (objectId != "") {
        var selection = SlidesApp.getActivePresentation().getSelection();
        var baseImage = selection.getCurrentPage().getPageElementById(objectId);
        var pageElements = selection.getPageElementRange().getPageElements();
        for (var i = 0; i < pageElements.length; i++) {
          pageElements[i].setWidth(baseImage.getWidth());
          pageElements[i].setHeight(baseImage.getHeight());
        }
        prop.deleteProperty("baseImage");
      } else {
        throw new Error("Base image was not found.");
      }
    }