2016-05-11 5 views
0

У меня есть лист, в котором сохраняются идентификаторы. Теперь иногда мне нужно прочитать эти идентификаторы и проверить, соответствуют ли другие значения (Name) на листе ID. Код у меня есть:Оптимизация Google Script

var name = sheet.getRange(line,row).getValue(); 
    var id = sheet.getRange(line,10).getValue(); 
    if(name!== "" && id === "") 
    { 
    try 
    { get an ID} 

Теперь от того, что я прочитал, я знаю, что вызов каждого значения ячейки отдельно занимает намного больше времени. Однако я не уверен, как применять getValues ​​для исправления этих случаев. основном та же проблема в другом платье, у меня есть со следующим кодом:

var id = sheet.getRange(line,row).getValue();  
    if(id!== "" && id!="Not Found" && id!="Not Found old") 
    {  
     var url = "some api url "+id+"api key"; 
     try 
     { 
     var str = UrlFetchApp.fetch(url).getContentText(); 

Так как я использую получить значения для проверки каждого ID я получаю. Я предполагаю, что я должен был бы использовать какой-то

foreach(id) 

или ее

for(i= 0; i <= id.range; i++) 
{ 
use id[i] to blablabal 
} 
  • Но я не знаю, как осуществить это, какие-то идеи?
  • Может быть, даже другой, более эффективный способ?

ответ

0

После вызова getValues ​​вы получите двойной массив, например [[valueA1, valueB1], [value A2, value B2]]. Обработайте его в цикле for, который может быть двойным, если задействованы все комбинации строк и столбцов. Имейте в виду, что электронная таблица использует индексирование по 1 базе, но в JavaScript они основаны на 0. Часто верхняя строка является заголовком, поэтому она не указана в цикле ниже.

function processData() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getDataRange();   // all of data. could be some part of it 
    var values = range.getValues(); 
    for (var i = 1; i < values.length; i++) { // skipping with header row 
    for (var j = 0; j < values[0].length; j++) { 
     if (condition) { 
     // do something to values[i][j]; 
     } 
    } 
    } 
    range.setValues(values); // put updated values back 
} 

Если данные интерес, скажем, в столбце D, то вы можете решить, чтобы принести только этот столбец. Например:

function fetchStuff() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var lastRow = sheet.getLastRow(); 
    var range = sheet.getRange(1, 4, lastRow, 1); // all of column D, note 1-based indexing 
    var values = range.getValues(); 
    for (var i = 1; i < values.length; i++) { // skipping header row 
    if (condition) { 
     var str = UrlFetchApp.fetch(values[i][0]).getContentText(); 
     // do something 
    } 
    } 
} 

Имейте в виду, что fetch на сегодняшний день является самой медленной работы здесь, и что она подлежит quotas. Используйте Utilities.sleep(ms), чтобы избежать частого вызова служб и отслеживать, сколько данных вы запрашиваете у сценария.