从文本框中读取值

时间:2020-02-20 23:42:38

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

嗨,我正在尝试从Google幻灯片中创建的文本框中读取值

因此,我通过为数组中的每个值调用此函数来创建多个文本框

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是我定义的ID,以便以后参考。 textBoxText最初设置为0。

此脚本的目的是将文本框中的每个值与我拥有的数组中的值进行比较。然后完成计算,然后更新值。 我见过很多类似的问题,但似乎找不到正确的答案。

我不想只更新值,我特别需要读取值。 我基本上需要的是类似textBoxID[1].getText()的东西,但是我找不到类似的东西/可以实现相同目标的东西。任何帮助都会被广泛接受

1 个答案:

答案 0 :(得分:1)

  • @Override public void massInsert(List<Object> objects) throws Exception { Session session = this.sessionFactory.getCurrentSession(); // Create the query. It is important to consider that we will be using a // native query, which we will build from scratch. This is done in order to improve the insert speed. String hql = "insert into TABLE (column1, column2) VALUES "; // For each object, add a new object to insert. // In the end we will need to remove the last comma. for (int i = 0; i < objects.size(); i++) { hql = hql.concat("(?, ?),"); } hql = hql.substring(0, hql.length()-1); // Create the query. Query query = session.createSQLQuery(hql); // Now, for each object, set the needed parameters. int index = 1; for (Object o : objects) { query.setParameter(index++, o.getAttribute1()); query.setParameter(index++, o.getAttribute2()); } // Execute the query. query.executeUpdate(); } 的文本框不存在时,您要创建新的文本框。
  • textBoxID的文本框存在时,您想要修改文本框中的值。
  • 关于创建文本框,您想使用textBoxID的功能。
  • 您想使用Google Apps脚本实现这一目标。
  • 您已经能够使用脚本创建新的文本框。

如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。

示例情况:

在此修改中,作为示例情况,文本框的初始值为newTextBox。当幻灯片中不存在该文本框时,将创建新的文本框。当幻灯片中存在文本框时,将修改文本框的值。在这种情况下,0将添加到现有值。

模式1:

在此模式下,将使用1脚本。使用此功能之前,请设置变量newTextBoxpresentationIdpageIddata是一个样本值。

示例脚本:

data

模式2:

在这种模式下,使用// 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); } }); } 的值创建一个请求主体,并将其用于batchUpdate方法。这样,仅使用一个API调用。使用此功能之前,请设置变量datapresentationIdpageIddata是一个样本值。

示例脚本:

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) } } 。因此,我认为您的脚本编辑器可能与启用V8运行时一起使用。所以我将脚本修改为V8。请注意这一点。
  • 这是一个简单的修改后的脚本。因此,请根据您的实际情况对此进行修改。

参考文献:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。