Google 带有 Google 应用程序脚本的工作表:如何在返回最终结果之前向单元格写入 'status' 消息?
Google Sheets with Google App Script: How to write a 'status' message to the cell before returning the final result?
我有一个函数可能需要一段时间才能 return 输出。有没有办法让它在单元格中打印一条消息,然后在短时间内用输出覆盖消息?该函数可能需要 30 秒才能 运行 并且它可以在 20-30 个单元格中使用,因此很高兴看到哪个单元格仍在计算以及哪个单元格已完成。
function do_calc() {
print("Now doing the calculations...")
// ... (bunch of code here that does the calculations)
return output;
}
我尝试使用 setvalue(),但它说我无权在自定义函数中执行此操作。
更新:添加了图片
screenshot
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var active_range = sheet.getActiveRange();
sheet.getRange(active_range.getRowIndex(), 10).setValue('Running...');
Utilities.sleep(10000);
return 'Finished';
}
问题:
正如我在评论中所说,你不能 return
两次,因为第一个 return
语句会抵消后面的代码。
- 自定义函数中也不允许设置方法(如
setValue
),如 official documentation 中明确说明的那样。
解决方案:
解决方案是合并内置的 google 工作表公式 IFERROR。
=iferror(myFunction(),"Running...")
其中 myFunction
是:
function myFunction() {
try{
// some code that delays
Utilities.sleep(10000);
}
catch(e){
return e.message;
}
return 'Finished';
}
我添加了 try...catch 以确保您 return
与脚本相关的错误消息。否则,iferror
将隐藏它们。
小心!
自定义函数调用必须 return 在 30 秒内 。如果超过此时间,则自定义函数将 return 错误:
Exceeded maximum execution time
不会显示,因为您使用了 iferror
来弥补错误。
我有一个函数可能需要一段时间才能 return 输出。有没有办法让它在单元格中打印一条消息,然后在短时间内用输出覆盖消息?该函数可能需要 30 秒才能 运行 并且它可以在 20-30 个单元格中使用,因此很高兴看到哪个单元格仍在计算以及哪个单元格已完成。
function do_calc() {
print("Now doing the calculations...")
// ... (bunch of code here that does the calculations)
return output;
}
我尝试使用 setvalue(),但它说我无权在自定义函数中执行此操作。
更新:添加了图片 screenshot
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var active_range = sheet.getActiveRange();
sheet.getRange(active_range.getRowIndex(), 10).setValue('Running...');
Utilities.sleep(10000);
return 'Finished';
}
问题:
正如我在评论中所说,你不能 return
两次,因为第一个 return
语句会抵消后面的代码。
- 自定义函数中也不允许设置方法(如
setValue
),如 official documentation 中明确说明的那样。
解决方案:
解决方案是合并内置的 google 工作表公式 IFERROR。
=iferror(myFunction(),"Running...")
其中 myFunction
是:
function myFunction() {
try{
// some code that delays
Utilities.sleep(10000);
}
catch(e){
return e.message;
}
return 'Finished';
}
我添加了 try...catch 以确保您 return
与脚本相关的错误消息。否则,iferror
将隐藏它们。
小心!
自定义函数调用必须 return 在 30 秒内 。如果超过此时间,则自定义函数将 return 错误:
Exceeded maximum execution time
不会显示,因为您使用了 iferror
来弥补错误。