Как программно управлять направляющими (правила третьего)?

#google-apps-script #google-slides-api #google-slides

#google-apps-script #google-slides-api #google-слайды

Вопрос:

Есть ли какой-либо способ управлять руководствами (правила третьего) в презентации Google Slides. Насколько я прочитал документацию по сценарию Google Apps, нет способа управлять направляющими.

Я уже пробовал строки, которые вели бы себя как направляющие (правила третьего), но это не «настоящие» направляющие. Пользователь может удалить эти строки, и эти строки ограничены областью страницы слайдов.

Посмотрите на картинку, чтобы увидеть разницу между строками и направляющими (правила третьего):

разница в строках и направляющих

Чтобы включить руководства (правила третьего), перейдите сюда:

руководство

Ответ №1:

Запрос функции, позволяющий управлять направляющими через SlidesApp или Slides API, отправляется в средство отслеживания проблем. Пожалуйста, отметьте это, если вы обнаружите, что эта функция была бы полезной.

Краткий ответ

Как уже упоминалось, к сожалению, в настоящее время это невозможно ни через SlidesApp сервис, ни через 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));
  

ДЕМОНСТРАЦИЯ

тест обходного пути

Комментарии:

1. Интересно. Кажется идеальным решением. Как вы вычисляете размер экранов. Что, если это маленький экран, вы предложите получить экран с помощью javascript?

2. @PuzzledBoy — у вас действительно есть отличная идея — да! Размер окна можно использовать для определения отрицательного смещения, я об этом не думал, просто использовал произвольно большое значение (на самом деле не имеет значения, какой длины эти строки — они должны отображаться правильно на всех размерах экрана)

3. Я знаю, что это уже довольно старое, но я новичок в Apps script и подумал, что это действительно интересно! Мне было интересно, изменилось ли это с момента его первой публикации или вы все еще используете этот подход?

4. @user2191889 насколько мне известно, это, к сожалению, все еще имеет место, за это время ничего не изменилось. Единственный известный на данный момент обходной путь — использовать линии так, как если бы они были линиями сетки. Не идеально, но ладно…

Ответ №2:

Направляющие слайдов в настоящее время не могут управляться программно.

Руководства являются довольно недавним дополнением к Slides (с 18 апреля), и они еще не были реализованы в Slides API, не говоря уже о Apps Script. Единственный способ управлять ими на данный момент — вручную, через редактор слайдов.

Отправьте запрос функции:

Я бы посоветовал вам подать запрос на функцию в этом компоненте отслеживания проблем относительно реализации этой функциональности в Slides API. Я провел некоторое исследование по этому компоненту, и, похоже, никто этого еще не запрашивал.

Как только это будет сделано, вы сможете управлять этим из Apps Script через расширенный сервис слайдов, по крайней мере, до тех пор, пока не будут реализованы встроенные классы и методы Apps Script.