【问题标题】:Store data from an array and use it later存储数组中的数据并稍后使用
【发布时间】:2017-09-03 21:47:03
【问题描述】:

我有这个problem Cooper 帮助我解决了它(再次感谢),但现在我正在努力解决另一个问题。以下脚本将使用昨天日期作为第二个条件计算客户端代码将出现在另一个电子表格上的次数。

   function countSheets() 
 { 
  var vA = appSh();
  var td = Utilities.formatDate(subDaysFromDate(new Date(),2), Session.getScriptTimeZone(), "dd/MM/yyyy");
  var mbs=getAllSheets();
  //var s='';
  for (var i=2;i<vA.length;i++)
  {
    var d = Utilities.formatDate(new Date(vA[i][12]), Session.getScriptTimeZone(), "dd/MM/yyyy");
    for(var key in mbs)
    {
      if(vA[i][0]==key && d==td) 
      {
        mbs[key]+=1;
      }
    }
  }
  return mbs;
}

然后我有下面的代码,它将在主电子表格(表格)中搜索一个字符串,找到时将返回行号,还将搜索昨天的日期并返回列号。根据这些信息,我将获得需要从第一个脚本粘贴计数结果的范围。

    function runScript() 
{
  var ss=SpreadsheetApp.openById('ID');
  var mbs=countSheets();
  for(var key in mbs)
  {
    var sh=ss.getSheetByName(key);
    var rg=sh.getDataRange();
    var vA=rg.getValues();
    for(var i=0;i<vA.length;i++)
    {
      if(vA[i][1]=='Total Number of Applications')
      {
        var nr=i;
        break;//by terminating as soon as we find a match we should get improved performance.  Which is something you cant do in a map.
      }             
    }
    if(typeof(nr)!='undefined')//If we don't find a match this is undefined
    {
      var today=subDaysFromDate(new Date(),2).setHours(0,0,0,0);
      for(var i=0;i<vA[3].length;i++)
      {
        if(vA[3][i])//Some cells in this range have no contents
        {
          if(today.valueOf()==new Date(vA[3][i]).valueOf())
          {
            sh.getRange(nr+1,i+1,1,1).setValue(Number(mbs[key]));
          }
        }
      }
    }
  }
  return sh;
}

问题:我在主电子表格上有 24 行。所以我需要写相同的脚本 24 次。例如,我需要计算应用程序总数、呼叫总数、实时广告数等。如果我这样做,它将超过执行时间,因为每个脚本平均需要 25 秒才能运行。

我在该网站和互联网上进行了一些研究,并阅读了有关存储值并一遍又一遍地重复使用它们的信息。目前,我的脚本每次都必须通过同一个文件并针对每个条件进行计数。

Q1:是否有机会创建另一个数组,其中包含第二个脚本中的所有字符串?

Q2:如何使用 PropertiesService 或其他任何东西来存储数据而不必一遍又一遍地运行getValues()?我已经阅读了 Google 文档,但不能从中理解太多。

我希望这一切都有意义并且可以解决这个问题。

致以最诚挚的问候,

谢谢!

【问题讨论】:

    标签: javascript google-apps-script google-apps


    【解决方案1】:

    我解决问题的方法

    您可能应该将它写成几行,然后查看它们中的两行,看看每一行都有什么独特之处。每个人的独特之处在于您必须弄清楚如何通过外部函数调用来存储或访问。

    时间问题可能需要您单独运行这些函数。我有一个对话框,我用它来加载正是这样做的数据库。它加载 800 行并等待 10 秒,然后再加载 800 行并等待 10 秒,然后一直这样做,直到没有更多行为止。确实,这需要大约 10 分钟,但我可以在它工作的同时做其他事情,所以我真的不在乎需要多长时间。不过,我确实关心尽量减少对 Google 服务器的影响,所以我运行这样的东西并不是为了好玩。

    顺便说一下,10 秒的延迟是 gs 函数之外的。

    【讨论】:

    • 唯一让脚本变慢的是它必须为每张纸获取应用程序表的值。运行 Sheet1 -> getValues() -> 循环,运行工作表 -> getValues() -> 循环 ...所以我需要一个解决方案来存储该工作表中的所有值以重新使用它们。
    • 现实情况是,您不能一次获取所有工作表的 getValues()。因此,一次获取它们并将它们存储在一个数组中并不会真正为您带来太多好处。听起来您不会在 6 分钟内完成所有这些工作,所以我想我会继续考虑另一种选择。 "You can't always get what you want.But if you try, sometimes you might find You get what you need"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2015-02-12
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多