gpt4 book ai didi

javascript - 如何在 Javascript For 循环中调用 Google Script 函数

转载 作者:行者123 更新时间:2023-11-30 14:04:46 25 4
gpt4 key购买 nike

我有一个 Google Script 函数,它根据来自 Javascript 的值填充单元格GS 函数在 Javascript“For”循环中被调用。当我运行代码时,在“For”循环的所有增量运行完成之前,单元格不会被填充。

神奇的是,在 For 循环结束后,GS 函数开始填充相关单元格(它以某种方式记住了所有动态值)。但是,并非所有预期的单元格都得到填充,而且顺序也不正确。

尝试使用 .flush() - 没有帮助

GS函数:

function rolesInputer(role, i){
var rolesInputer = role;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var column = 3+i;
var cell = sheet.getRange(17,column);
cell.setValue(role);
}

JS函数:

function saveInput() {
var i;
for (i = 1; i <= dataEncoded; i++) {
sleep(1000);
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
google.script.run.withSuccessHandler(roleSelected, i).rolesInputer(roleSelected, i);
alert("executed");
}
google.script.host.close();
}

最佳答案

  • 您想使用 google.script.run() 将 HTML 端的值发送到 Google Apps 脚本端.

如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。

首先,关于您的以下问题,我认为您问题的原因是google.script.run()通过异步处理工作。

Magically, after the For loop finishes, the GS function starts populating relevant cells (somehow it remembers all the dynamic values). However, not all expected cells get populated and also not in the correct order.

为了避免这种情况,我认为您的情况有两种模式。

模式一:

在此模式中,在检索到所有值后,这些值将发送到 Google Apps 脚本。当您测试该模式时,请修改如下。

Google Apps 脚本:

function rolesInputer(values){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange(17, 3, 1, values.length).setValues([values]);
}

HTML 和 Javascript:

我用了 <select>...</select>作为示例值。在此示例中,当打开 HTML 时,脚本将运行。

<select id="role1"><option value="role1" selected>role1</option></select>
<select id="role2"><option value="role2" selected>role2</option></select>
<select id="role3"><option value="role3" selected>role3</option></select>
<select id="role4"><option value="role4" selected>role4</option></select>
<select id="role5"><option value="role5" selected>role5</option></select>

<script>
function saveInput() {
var dataEncoded = 5;
var values = [];
for (var i = 1; i <= dataEncoded; i++) {
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
values.push(roleSelected);
}
google.script.run.withSuccessHandler(() => {google.script.host.close()}).rolesInputer(values);
}
saveInput();
</script>

模式二:

在此模式中,使用 for 循环将每个值发送到 Google Apps 脚本。当您测试该模式时,请修改如下。

Google Apps 脚本:

在此模式中,未修改 Google Apps 脚本。

HTML 和 Javascript:

在此示例中,当打开 HTML 时,将运行脚本。

<select id="role1"><option value="role1" selected>role1</option></select>
<select id="role2"><option value="role2" selected>role2</option></select>
<select id="role3"><option value="role3" selected>role3</option></select>
<select id="role4"><option value="role4" selected>role4</option></select>
<select id="role5"><option value="role5" selected>role5</option></select>

<script>
function work(roleSelected, i) {
return new Promise((resolve, reject) => {
google.script.run.withSuccessHandler(() => resolve()).rolesInputer(roleSelected, i);
});
}

async function saveInput() {
var dataEncoded = 5;
for (var i = 1; i <= dataEncoded; i++) {
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
await work(roleSelected, i);
}
}

saveInput().then(() => google.script.host.close());
</script>

注意事项:

  • 考虑到工艺成本,我认为模式1更好。

引用资料:

  • > google.script.run

    google.script.run is an asynchronous client-side JavaScript API available in HTML-service pages that can call server-side Apps Script functions.

如果这对您的情况没有用,我深表歉意。

关于javascript - 如何在 Javascript For 循环中调用 Google Script 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55639466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com