首页 > 解决方案 > 检查其他单元格后写入工作表的脚本超时

问题描述

我有一个 11000 行 X 50 列的 Google 工作表。我需要检查每一行的城市和州,并相应地设置一个字段,调用区域。这需要很长时间,并且仅在完成工作表的 25% 后超时。我对 App Scripts 和 Javascript 非常陌生。必须有更好的方法来做到这一点。任何建议,将不胜感激。这是脚本:

    function setRegion() {
      var region = "Not Found";
      var state;
      var city;

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Comp Server List');
      var lastRow =sheet.getLastRow(); 
      var startRow = 5;
      console.log("10");
      for (n = startRow; n < lastRow; n++){
        var state = sheet.getRange(n,8).getValue();
        var city = sheet.getRange(n,7).getValue();
        switch(state) {
          case "AZ":
          region = "Arizona";
          break;
          case "NV":
            if (city == "Papillion"){
              region = "Enterprise Data Center";
            } else {
              region = "Northern California";
            };
          break;
          case "CA":
            switch(city){
              case "Santa Maria":
              case "Rancho Cordova":
              case "Sacramento":
              case "Folsom":
              case "Carmichael":
              case "Grass Valley":
              case "Woodland":
              case "Shasta":
              case "Redding":
              case "Red Bluff":
              case "Santa Cruz":
              case "San Francisco":
              case "Redwood":
              case "San Francisco":
                region = "Northern California";
                break;
              case "Camarillo":
              case "Oxnard":
              case "Bakersfield":
              case "Merced":
              case "San Andreas":
              case "Stockton":
              case "Arroyo Grande":
              case "San Luis Obispo":
              case "Los Angeles":
              case "San Bernardino":
              case "Glendale":
              case "Northridge":
              case "San Bernardino":
              case "Long Beach":
              case "Redlands":
              case "Pasadena":
                region = "Northern California";
                break;
            }
            // code block
            break;
          case "NE":
            if (city == "Papillion"){
              region = "Enterprise Data Center";
            } else {
              region = "Texas";
            };
            break;
          case "IA":
          case "ND":
          case "MN":
            region = "Midwest";
          break;
          
          case "WA":
          case "OR":
            region = "Midwest";
          break;
          case "KY":
          case "OH":
          case "TN":
          case "GA":
          case "AR":
            region = "Southeast";
          break;
            
          case "TX":
          case "NM":
            if (city == "Richardson"){
              region = "Enterprise Data Center";
            } else {
              region = "Texas";
            };
            break;
          case "CO":
            region = "Enterprise Data Center";
            break;
          default:
            region = "Not Found";
            break;
          } 
          console.log("row = "+n,"state ="+ state, "city ="+ city, "region = "+ region);
          sheet.getRange(n,9).setValue(region);
    }

  }

标签: javascriptgoogle-sheets

解决方案


您可以在官方最佳实践指南中找到您的要求:

脚本通常需要从电子表格中读取数据,执行计算,然后将数据结果写入电子表格。Google Apps 脚本已经有一些内置优化,例如使用前瞻缓存来检索脚本可能获取的内容并写入缓存来保存可能设置的内容。

您可以编写脚本以最大限度地利用内置缓存,最大限度地减少读取和写入次数。交替读取和写入命令很慢。为了加快脚本的速度,用一个命令将所有数据读入数组,对数组中的数据执行任何操作,然后用一个命令写出数据。

所以使用getValues()( reference ) 一次,计算结果,然后调用setValues(values)( reference ) 一切。


推荐阅读