使用DuplicateObject请求的可变键创建objectIds映射

时间:2018-08-07 13:55:53

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

在创建“重复对象”请求时,objectIds映射不会让我在下面的强调部分中放置变量:

var alternateSlideId = 'alternate_' + i;
{ 
    duplicateObject:
    {
        objectId: alternateSlide,
        objectIds: {
            **alternateSlide**: 'Copied_Alternate_Slide_' + i,
        }
    }
}

(i是一个循环数字) 据我了解,map函数的作用类似于
    ((objectId to be copied) : (name of new objectId))
我无法在map函数的左侧使用变量,也无法将'alternate_' + i放入map的左侧,并且不确定原因。我需要复制之前已经复制过的多张幻灯片,因此要使用变量名。

如何为objectIds映射分配变量键?

1 个答案:

答案 0 :(得分:1)

您需要指定唯一 ID。不仅是幻灯片的独特之处,还包括整个演示文稿。考虑像在this answer中一样使用Utilities.getUuid()

Google Apps脚本本质上是JavaScript 1.6,因此要写入变量属性名称,您需要使用括号运算符,而不是对象文字构造函数中的点运算符或变量名/简写语法。您过去的尝试很可能是从构造函数尝试完成的:

不起作用(对象文字构造函数):

var v = "some prop name";
var myObj = {
  v: "some prop value",
};
console.log(myObj); // {'v': 'some prop value'}

不起作用(点运算符):

var v = "some prop name";
var myObj = {};
myObj.v = "some prop value";
console.log(myObj); // {'v': 'some prop value'}

不起作用(因为GAS不是ECMAScript2015或更高版本),并且在保存时抛出“无效的属性ID”错误:

var v = "some prop name";
var myObj = {
  [v]: "some prop value",
};
console.log(myObj);

工作(括号运算符):

var v = "some prop name";
var myObj = {};
myObj[v] = "some prop value";
console.log(myObj); // {'some prop name': 'some prop value'}

因此,用于复制由变量altSlide表示的幻灯片的代码必须类似于:

var newAltSlideId = ("copied_altSlide_" + i + "_" + Utilities.getUuid()).slice(0, 50);
var dupRqConfig = {
  objectId: altSlide.objectId, // the object id of the source slide
  objectIds: {} // map between existing objectIds on the altSlide, and the new ids
};
// Set the duplicate's ID
dupRqConfig.objectIds[altSlide.objectId] = newAltSlideId;
// If you want to set the objectIds in the duplicate, you need to
// loop over altSlide's child objects. An example:
altSlide.pageElements.forEach(function (child, index) {
  dupRqConfig.objectIds[child.objectId] = /** some new id */;
});
requests.push({ duplicateObject: dupRqConfig }); // add the request to the batchUpdate list

参考文献: