【问题标题】:How to programmatically control the guides (rules of third)?如何以编程方式控制指南(第三规则)?
【发布时间】:2020-08-25 17:30:46
【问题描述】:

是否有任何方法可以控制 Google 幻灯片演示文稿中的指南(第三规则)。据我阅读 Google Apps 脚本文档,没有办法控制这些指南。

我已经尝试过类似于指南(第三规则)的线条,但这些不是“真正的”指南。用户可以删除这些行,这些行仅限于幻灯片页面区域。

看图了解线条和参考线的区别(第三条规则):

要启用指南(第三规则),请访问此处:

【问题讨论】:

    标签: google-apps-script google-slides-api google-slides


    【解决方案1】:

    允许通过SlidesApp 或幻灯片 API 控制指南的功能请求已提交至issue tracker。如果您觉得该功能有用,请加注星标。

    简答

    如前所述,不幸的是,这目前无法通过SlidesApp 服务或Slides API 实现。

    解决方法

    实际上可以通过传递一个负整数作为insertLine 的参数来使线条延伸到幻灯片边界之外。至于是否可以删除线,如果将指南拖出幻灯片边界,用户也可以“删除”指南。

    我无法模仿的指南的唯一属性是在呈现时隐藏它们(因为隐藏了真正的指南)。

    以下是类似于您的方法的解决方法(创建Lines 的网格):

    指南

    /**
     * @summary emulates adding guides to the Slide
     * 
     * @param {{
     *  rows : (number|1),
     *  deleteOld : (boolean|true),
     *  cols : (number|1),
     *  color : string
     * }} 
     */
    const showGuides = ({ deleteOld = true, rows = 1, cols = 1, color = "#d3d3d3" } = {}) => {
    
        const presentation = SlidesApp.getActivePresentation();
        const currPage = presentation.getSelection().getCurrentPage();
    
        const prop = "guides";
    
        const store = PropertiesService.getUserProperties();
    
        /** @type {string[]} */
        let guideRefs = JSON.parse(store.getProperty(prop) || "[]");
    
        const lines = currPage.getLines();
    
        const oldLines = lines.filter((line) => guideRefs.includes(line.getObjectId()));
    
        if (deleteOld) {
            oldLines.forEach(line => line.remove());
    
            guideRefs = removeElements(guideRefs, oldLines.map(l => l.getObjectId()));
        }
    
        const currWidth = presentation.getPageWidth();
        const currHeight = presentation.getPageHeight();
    
        const xStep = Math.floor(currWidth / cols);
        const yStep = Math.floor(currHeight / rows);
    
        const newGuides = [];
    
        const maxScreen = 4096;
    
        for (let x = 0; x <= cols; x++) {
            const line = currPage.insertLine(
                SlidesApp.LineCategory.STRAIGHT,
                xStep * x, -maxScreen, xStep * x, currHeight + maxScreen
            );
    
            const fill = line.getLineFill();
            fill.setSolidFill(color);
    
            const oid = line.getObjectId();
            guideRefs.push(oid);
            newGuides.push(line);
        }
    
        for (let y = 0; y <= rows; y++) {
            const line = currPage.insertLine(
                SlidesApp.LineCategory.STRAIGHT,
                -maxScreen, yStep * y, currWidth + maxScreen, yStep * y
            );
    
            const fill = line.getLineFill();
            fill.setSolidFill(color);
    
            const oid = line.getObjectId();
            guideRefs.push(oid);
            newGuides.push(line);
        }
    
        store.setProperty(prop, JSON.stringify(guideRefs));
    };
    

    实用程序

    /**
     * @summary removes elements from an array
     * @param {any[]} arr 
     * @param {...any} elems
     * @returns {any[]}
     */
    const removeElements = (arr, ...elems) => arr.filter((elem) => !elems.includes(elem));
    

    演示

    【讨论】:

    • 有趣。似乎是一个完美的解决方案。您如何计算屏幕尺寸。如果它是一个小屏幕,你会建议使用 javascript 获取屏幕吗?
    • @PuzzledBoy - 你真的有一个好主意 - 是的!窗口大小可用于确定负偏移量,我没有想到,只是使用了一个任意大的值(这些线有多长并不重要——它们应该在所有屏幕尺寸上正确显示)
    【解决方案2】:

    目前无法以编程方式管理幻灯片指南。

    指南是最近才添加到幻灯片 (since April '18) 的,尚未在 Slides API 上实施,更不用说在 Apps 脚本上实施了。目前管理它们的唯一方法是通过幻灯片编辑器手动管理。

    提交功能请求:

    我建议您在 this Issue Tracker component 上提交关于在 Slides API 上实现此功能的功能请求。我对该组件进行了一些研究,似乎还没有人提出这个要求。

    完成后,您可以通过 Advanced Slides Service 从 Apps Script 进行管理,至少在 Apps Script 内置类和方法实施之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      相关资源
      最近更新 更多