似乎如果使用 SlidesApp.getActivePresentation()
在 AppsScript 中,函数的结果不是新鲜的,而是事先准备好的东西。
场景
假设您有两个用户同时在 AppsScript 中执行以下功能:
function updateSlideText(slideId) {
// Request exclusive write access to the document
var lock = LockService.getDocumentLock();
lock.waitLock(15000);
// Perform changes
var presentation = SlidesApp.getActivePresentation();
var textBox = presentation.getSlideById(MY_SLIDE_ID).getPageElementById(MY_TEXTBOX_ID);
textBox.asShape().getText().setText('My text');
// Save and release lock
presentation.saveAndClose();
lock.releaseLock();
}
如果同时调用此函数两次,则生成的幻灯片将包含文本“My textMy text”。
当我添加
Utilities.sleep(10000)
就在锁释放之前,它将第二次执行延迟了 10 秒,但在这 10 秒之后,我仍然得到相同的结果。另一方面,如果我真的延迟 调用 函数10s,输出正常。由此我得出结论,我是否调用
saveAndClose
并不重要。并使用锁。一旦调用该函数,它将始终具有陈旧数据。有没有解决的办法?获取锁后是否不能请求加载新数据?更多详情
一些更多的伪代码可以更好地说明问题用例:
// The addon frontend
websocket.onMessage((message) => {
if (message.type === 'pollUpdate') {
const slideWithPoll = store.getState().slides.find(
slide => slide.pollId === message.pollId
);
if (slideWithPoll.title !== message.poll.title) {
google.script.run.updateSlideText(slideWithPoll.id, message.poll.title);
}
}
});
最佳答案
我相信你的目标如下。
为此,这个答案怎么样?
问题和解决方法:
当我测试你的情况时,我可以确认同样的问题,如
My textMy text
.经过多次测试,在这种情况下,我认为LockService可能不会影响Google Slides。因此,作为一种解决方法,我建议使用 Web Apps 作为包装器。因为众所周知,Web Apps 可以由 LockService 独占运行。此变通方法的流程如下。这样,即使在运行脚本时,脚本也可以与 LockService 同时运行。
用法:
该示例脚本的用法如下。请执行以下流程。
1. 准备脚本。
当你的脚本被使用时,它变成如下。请将以下脚本复制并粘贴到脚本编辑器中。请设置
MY_SLIDE_ID
和 MY_TEXTBOX_ID
.function doGet() {
// This is your script.
var presentation = SlidesApp.getActivePresentation();
var textBox = presentation.getSlideById(MY_SLIDE_ID).getPageElementById(MY_TEXTBOX_ID);
var text = textBox.asShape().getText();
text.setText('My text');
return ContentService.createTextOutput("ok");
}
// Please run this function.
function main() {
var lock = LockService.getDocumentLock();
if (lock.tryLock(10000)) {
try {
const url = "https://script.google.com/macros/s/###/exec"; // Please set the URL of Web Apps after you set the Web Apps.
const res = UrlFetchApp.fetch(url);
console.log(res.getContentText())
} catch(e) {
throw new Error(e);
} finally {
lock.releaseLock();
}
}
}
2. 部署 Web 应用程序。
https://www.googleapis.com/auth/drive.readonly
的范围和 https://www.googleapis.com/auth/drive
到访问 token 。这些范围是访问 Web 应用程序所必需的。 https://script.google.com/macros/s/###/exec
.https://script.google.com/macros/s/###/exec
的网址至 url
以上脚本。并请重新部署 Web 应用程序。这样,最新的脚本就会反射(reflect)到 Web Apps 中。所以请注意这一点。 4. 测试此解决方法。
请运行
main()
的功能由 2 个用户同时进行,正如您所测试的那样。由此,发现脚本是独占运行的。在我的环境中,在这种情况下,我确认即使没有使用 LockService,脚本也会以独占方式运行。但我想建议使用 LockService 以防万一。笔记:
引用:
关于google-apps-script - 是否可以在 Apps Script 中获取新的 Google 幻灯片演示数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62166790/