Читать значение из текстового поля - PullRequest
0 голосов
/ 21 февраля 2020

Привет. Я пытаюсь прочитать значения из созданных текстовых полей в Google Slides.

Итак, я создаю несколько текстовых полей, вызывая эту функцию для каждого значения в массивах

function newTextBox(textBoxID, xpos, ypos, textBoxText) {

var elementId = textBoxID;
var requests = [{
  createShape: {
    objectId: elementId,
    shapeType: 'TEXT_BOX',
    elementProperties: {
      pageObjectId: pageId,   
      'size': {
        'width': {
          'magnitude': 53.5748,
          'unit': 'PT'
        },
        'height': {
          'magnitude': 22.6772,
          'unit': 'PT'
        }

      },
      transform: {
        scaleX: 1,
        scaleY: 1,
        translateX: xpos,
        translateY: ypos,
        unit: 'PT'
      }
    }
  }
},

// Insert text into the box, using the supplied element ID.
{
  insertText: {
    objectId: elementId,
    insertionIndex: 0,
    text: textBoxText
  }
}];

// Execute the request.
var createTextboxWithTextResponse = Slides.Presentations.batchUpdate({
  requests: requests
}, presentationId);
var createShapeResponse = createTextboxWithTextResponse.replies[0].createShape;
console.log('Created textbox with ID: %s', createShapeResponse.objectId);
}

Итак, textBoxID это идентификаторы, которые я определил для удобства использования позже. textBoxText изначально установлен как 0.

Цель этого скрипта - сравнить каждое значение в текстовых полях со значением в массиве, который у меня есть. Затем выполняются вычисления, а затем значение обновляется. Я видел много подобных вопросов, но, похоже, не могу найти правильный ответ.

Я не хочу просто обновлять значение, мне нужно прочитать его. В основном мне нужно что-то вроде textBoxID[1].getText(), но я не могу найти что-то подобное / что-то, что достигает той же цели. Любая помощь будет принята

1 Ответ

1 голос
/ 21 февраля 2020
  • Если текстовое поле textBoxID не существует, вы хотите создать новое текстовое поле.
  • Когда текстовое поле textBoxID существует, вы хотите изменить значение в текстовом поле.
  • О создании текстового поля вы хотите использовать функцию newTextBox.
  • Вы хотите добиться этого с помощью скрипта Google Apps.
  • Вы уже смогли создайте новое текстовое поле, используя ваш скрипт.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Пример ситуации:

В этой модификации, в качестве примера ситуации, начальное значение текстового поля равно 0. И когда текстовое поле не существует на слайде, создается новое текстовое поле. Когда текстовое поле существует на слайде, значение текстового поля изменяется. В этом случае к существующему значению добавляется 1.

Шаблон 1:

В этом шаблоне используется ваш скрипт newTextBox. Прежде чем использовать это, пожалуйста, установите переменные presentationId, pageId и data. data является примером значения.

Пример сценария:

// Please set following variables.
const presentationId = "###";
const pageId = "###";

function newTextBox(textBoxID, xpos, ypos, textBoxText) {
  var elementId = textBoxID;
  var requests = [
        {createShape: {objectId: textBoxID, shapeType: 'TEXT_BOX', elementProperties: {pageObjectId: pageId, size: {width: {magnitude: 53.5748, unit: 'PT'}, height: {magnitude: 22.6772, unit: 'PT'}}, transform: {scaleX: 1, scaleY: 1, translateX: xpos, translateY: ypos, unit: 'PT'}}}},
        {insertText: {objectId: textBoxID, insertionIndex: 0, text: textBoxText}}
  ];
  var createTextboxWithTextResponse = Slides.Presentations.batchUpdate({requests: requests}, presentationId);
  var createShapeResponse = createTextboxWithTextResponse.replies[0].createShape;

  Logger.log('Created textbox with ID: %s', createShapeResponse.objectId);
}

// Please run this function.
function myFunction() {
  var data = [
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
  ];


  const slide = SlidesApp.openById(presentationId).getSlideById(pageId);
  const obj = slide.getShapes().reduce((o, e) => {
    o[e.getObjectId()] = e;
    return o;
  }, {});
  ar.forEach(({textBoxID, xpos, ypos, textBoxText}) => {
    if (textBoxID in obj) {
      const oldValue = obj[textBoxID].getText().asString(); // Here, you can retrieve the value of existing textbox.
      const newValue = Number(oldValue) + 1;
      obj[textBoxID].getText().replaceAllText(oldValue, newValue);
    } else {
      newTextBox(textBoxID, xpos, ypos, textBoxText);
    }
  });
}

Шаблон 2:

В этом шаблоне создается одно тело запроса с использованием значений data и используйте его для метода batchUpdate. При этом используется только один вызов API. Прежде чем использовать это, пожалуйста, установите переменные presentationId, pageId и data. data является примером значения.

Пример сценария:

function myFunction() {
  // Please set following variables.
  var data = [
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
    {textBoxID: "###", xpos: ###, ypos: ###, textBoxText: "0"},
  ];
  const presentationId = "###";
  const pageId = "###";


  const slide = SlidesApp.openById(presentationId).getSlideById(pageId);
  const obj = slide.getShapes().reduce((o, e) => {
    o[e.getObjectId()] = e;
    return o;
  }, {});
  const requests = data.reduce((ar, {textBoxID, xpos, ypos, textBoxText}) => {
    if (textBoxID in obj) {
      const oldValue = obj[textBoxID].getText().asString(); // Here, you can retrieve the value of existing textbox.
      const newValue = Number(oldValue) + 1;
      obj[textBoxID].getText().replaceAllText(oldValue, newValue);
    } else {
      ar.push([
        {createShape: {objectId: textBoxID, shapeType: 'TEXT_BOX', elementProperties: {pageObjectId: pageId, size: {width: {magnitude: 53.5748, unit: 'PT'}, height: {magnitude: 22.6772, unit: 'PT'}}, transform: {scaleX: 1, scaleY: 1, translateX: xpos, translateY: ypos, unit: 'PT'}}}},
        {insertText: {objectId: textBoxID, insertionIndex: 0, text: textBoxText}}
      ]);
    }
    return ar;
  }, []);
  if (requests.length > 0) {
    var createTextboxWithTextResponse = Slides.Presentations.batchUpdate({requests: requests}, presentationId);
    Logger.log(createTextboxWithTextResponse)
  }
}

Примечание:

  • В вашем сценарии используется console.log. Поэтому я подумал, что ваш редактор сценариев может использовать для включения V8 runtime. Поэтому я изменил скрипт как V8. Пожалуйста, будьте осторожны.
  • Это простой модифицированный скрипт. Поэтому, пожалуйста, измените это для вашей реальной ситуации.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

...