将Google脚本计算移至Google Cloud。有可能吗?

时间:2017-08-23 16:01:54

标签: google-apps-script google-sheets google-bigquery google-cloud-platform google-compute-engine

我的电子表格包含100k +行和一列,google脚本每行应用大约10个正则表达式,并将结果存储在电子表格中。在结束时,我有100 k +行和10列的表。

所有逻辑写在JS上,计算分别运行到每个10k行,因为执行时间受到6分钟的限制。它不时需要超过6分钟并且会出错,并且需要在我的电脑上安装巨型JS内存。

我想要的是更快地完成它,而不需要我的计算。

请提供一些建议,谷歌云服务可以用于此吗?

我知道代码不优雅,而且可以稍微优化一下,但这里是:

function RegExForCombine4(sa,parametr,FR,LR,ValForRep,Categoris1,RegExpsLeng,ObjmyArrRegEx,RegexpsObjects,ObjmyArrRegExStrings,catOrnot,colForStart){
  var ValForRepLeng = ValForRep.length
  var ChangeVals = [];
  for (var y=0;y<Categoris1.length;y++){                                    
    for (var q = 0;q<RegExpsLeng;q++){ 
      if(ValForRep[y].indexOf(RegexpsObjects[Categoris1[y]][q][parametr*2]) !== -1){ 
        ValForRep[y]=ObjmyArrRegExStrings[Categoris1[y]][q][parametr*2+1]
        ChangeVals.push([ValForRep[y]])
        break
      }
      if(ValForRep[y].match(RegexpsObjects[Categoris1[y]][q][parametr*2])){ 
        ValForRep[y]=ValForRep[y].replace(ObjmyArrRegEx[Categoris1[y]][q][parametr*2], ObjmyArrRegEx[Categoris1[y]][q][parametr*2+1]); 
        ChangeVals.push([ValForRep[y]])
        break 
      }
    }
  }
  sa.getRange(FR,parametr+colForStart+catOrnot,ChangeVals.length,1).setValues(ChangeVals)
}

function BaseRegExForCombine4(sheetName,FR,LR,RegExpsLeng,FC,LC,catOrnot,colForStart){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sa = ss.getSheetByName(sheetName);
  var ValForRepBase = sa.getRange(FR,1,LR,1).getValues(); 
  var ValForRep =[]
  for(var v=0;v<ValForRepBase.length;v++){
    ValForRep[v]=ValForRepBase[v].toString().toLowerCase()
  }
  var ValForRepCopy = []
  var Categoris1 = sa.getRange(FR,colForStart,LR,1).getValues();
  var RegexpsObjects = {}
  if(catOrnot==0){
    for(var u = 0;u<Categoris1.length;u++){  
      Categoris1[u]='Категории';
    }
  } else {
    for(var u = 0;u<Categoris1.length;u++){ 
      Categoris1[u]=Categoris1[u].toString();
    }
  }
  var Categoris = unique(Categoris1);
  for(var u=0;u<=LC+1;u++){ 
    ValForRepCopy[u]=ValForRep.slice(0)
  }
  for(var u=0;u<Categoris.length;u++){
    try{  
      RegexpsObjects[Categoris[u]]=ss.getSheetByName(Categoris[u]).getRange(26, 3, RegExpsLeng, 20).getValues();
    } catch(e){}
  }
  var ObjmyArrRegEx = {}; 
  var ObjmyArrRegExStrings = {};
  for(var u=0;u<Categoris.length;u++){
    ObjmyArrRegEx[Categoris[u]]=ss.getSheetByName(Categoris[u]).getRange(26, 3, RegExpsLeng, 20).getValues();
    ObjmyArrRegExStrings[Categoris[u]]=ss.getSheetByName(Categoris[u]).getRange(26, 3, RegExpsLeng, 20).getValues();
    for (var y=0;y<9;y++){
      for (var r=0;r<20;r++){
        ObjmyArrRegEx[Categoris[u]][r][y*2] = new RegExp(RegexpsObjects[Categoris[u]][r][y*2],"gi");
        ObjmyArrRegExStrings[Categoris[u]][r][y*2]=RegexpsObjects[Categoris[u]][r][y*2+1].toString();
      }
    }
  }
  for(i=FC;i<=LC;i++){
    RegExForCombine4(sa,i,FR,LR,ValForRepCopy[i],Categoris1,RegExpsLeng,ObjmyArrRegEx,RegexpsObjects,ObjmyArrRegExStrings,catOrnot,colForStart)
  }
}

function AddressRegExForCombineByCategory(sheetName,category,FC,LC){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
  var lastrowonSheet = ss.getLastRow()
  ss.getRange(10, 1, lastrowonSheet ,15).sort(8)
  var categorys = ss.getRange(1, 8,lastrowonSheet-10,1).getValues()
  for (var i=0;i<categorys.length;i++){
    categorys[i]=categorys[i].toString()
  }
  var FR = categorys.indexOf(category)+1
  var LR = categorys.lastIndexOf(category)+2 
  var LastA1Not = LR-FR
  var RegExpsLeng = 20
  BaseRegExForCombine4(sheetName,FR,LastA1Not,RegExpsLeng,FC,LC,1,8)
  Library1.setformula(sheetName,"=JOIN(\" \";H"+FR+":R"+FR+")",'G'+FR+':G'+LR)  
}

0 个答案:

没有答案