首页 > 解决方案 > 带有 Google Script 的 Web App 读取 Gsheet 速度优化

问题描述

我用 GS 制作了一个简单的 Web 应用程序,现在需要优化从 Gsheet 加载数据的速度。应用说明:

它是一种在图像中收集产品正确颜色的工具。当用户单击加载图像按钮时,应用程序将从 Gsheet 中读取 URL,其中所有任务都存储在行中并加载图像。然后用户从调色板中选择颜色并提交颜色。然后应用程序会将选定的颜色值保存到图像 URL 的同一行。

每个任务应分配给 n 个用户(不多不少,反馈要求如下)以避免偏见,并且同一任务不应多次分配给同一用户。所以我以这种方式存储任务:

index   imageID      URL   feedbackRequested   user   rgb_value
 1      104904677    ***          3                            
 2      104904677    ***          3                            
 3      104904677    ***          3  
 4      104904678    ***          2                           
 5      104904678    ***          2                                                      

我将n 行分散feedbackRequested到 n 行来分配任务。因此,当用户单击加载图像时,将执行以下操作:

  1. 获取包含该用户已完成的所有 imageID 的数组;
  var user = Session.getActiveUser().getEmail();
  var data = sheet.getRange(1,2,sheet.getLastRow(),4).getValues();
  var filter_user = ArrayLib.filterByText(data, 3, user);
  var user_imageIDs = filter_user.map(function(value,index) {return value[0]});
  1. 如果 imageID 在数组中或者用户不为空,则继续查找直到找到该行;
var ct = 1;
while ( (user_imageIDs.includes(data[ct][0])) || (data[ct][3] != '') ) {
    ct++;
  };
  1. 将用户值设置为该行上的用户并将他的答案保存到 rgb_value。
sheet.getRange(ct+1, 5,1,2).setValues(user, somevalue); 

这样,使用 while 循环查找条件行需要花费大量时间。还有其他方法可以做到这一点吗?

我知道这是很多信息。首先十分感谢!如果您需要复制整个代码,请告诉我。

标签: google-apps-scriptweb-applications

解决方案


  • 创建一imageID,其中包含usr
const imageSet = data.reduce((s,[id,_,_,usr])=> 
    usr === user ? s.add(id) : s,
  new Set)
  • 使用findIndex查找 data数组的索引,其中usr为空且 id 不在 imageSet 中:
const ct = data.findIndex(([id,_,_,usr])=> usr === "" && !imageSet.has(id))

推荐阅读