如何以编程方式控制指南(第三规则)?
How to programmatically control the guides (rules of third)?
有什么方法可以控制 Google 幻灯片演示中的指南(第三规则)。据我阅读 Google Apps 脚本文档,没有控制指南的方法。
我已经尝试过表现得像指南的线条(第三条规则),但这些不是“真正的”指南。用户可以删除这些行,这些行仅限于幻灯片页面区域。
看图了解线条和参考线的区别(第三条规则):
要启用指南(第三条规则),请转到此处:
目前无法以编程方式管理幻灯片指南。
指南是幻灯片的最新添加内容(since April '18), and they haven't been implemented on Slides API,更不用说 Apps 脚本了。目前唯一的管理方式是通过幻灯片编辑器手动管理。
提交功能请求:
我建议您在 this Issue Tracker component 上提交关于在幻灯片 API 上实现此功能的功能请求。我对该组件进行了一些研究,似乎还没有人提出这个要求。
完成后,您可以通过 Advanced Slides Service 从 Apps 脚本管理它,至少在 Apps 脚本 built-in 类 和方法实现之前是这样。
A feature request to allow guides to be controlled via SlidesApp
or Slides API is submitted to the issue tracker. Please star it if you find that the feature would be useful.
简答
如前所述,不幸的是,目前无法通过 SlidesApp
service or the Slides API。
解决方法
实际上可以通过传递一个负整数作为 insertLine
的参数来使线条延伸到幻灯片边界之外。至于能够删除线条,如果将指南拖出幻灯片边界,用户也可以“删除”指南。
我无法模仿的唯一 属性 指南是在呈现时隐藏它们(因为真正的指南是隐藏的)。
下面是与您的方法类似的解决方法(创建 Line
的网格):
向导
/**
* @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));
演示
有什么方法可以控制 Google 幻灯片演示中的指南(第三规则)。据我阅读 Google Apps 脚本文档,没有控制指南的方法。
我已经尝试过表现得像指南的线条(第三条规则),但这些不是“真正的”指南。用户可以删除这些行,这些行仅限于幻灯片页面区域。
看图了解线条和参考线的区别(第三条规则):
要启用指南(第三条规则),请转到此处:
目前无法以编程方式管理幻灯片指南。
指南是幻灯片的最新添加内容(since April '18), and they haven't been implemented on Slides API,更不用说 Apps 脚本了。目前唯一的管理方式是通过幻灯片编辑器手动管理。
提交功能请求:
我建议您在 this Issue Tracker component 上提交关于在幻灯片 API 上实现此功能的功能请求。我对该组件进行了一些研究,似乎还没有人提出这个要求。
完成后,您可以通过 Advanced Slides Service 从 Apps 脚本管理它,至少在 Apps 脚本 built-in 类 和方法实现之前是这样。
A feature request to allow guides to be controlled via
SlidesApp
or Slides API is submitted to the issue tracker. Please star it if you find that the feature would be useful.
简答
如前所述,不幸的是,目前无法通过 SlidesApp
service or the Slides API。
解决方法
实际上可以通过传递一个负整数作为 insertLine
的参数来使线条延伸到幻灯片边界之外。至于能够删除线条,如果将指南拖出幻灯片边界,用户也可以“删除”指南。
我无法模仿的唯一 属性 指南是在呈现时隐藏它们(因为真正的指南是隐藏的)。
下面是与您的方法类似的解决方法(创建 Line
的网格):
向导
/**
* @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));
演示