Google App Script - проверьте значение ячейки по отношению к столбцу A, затем отредактируйте соответствующий столбец B - PullRequest
0 голосов
/ 18 мая 2018

поэтому у меня есть следующий код, который отлично работает для наших целей, мне потребовалось много времени, чтобы собрать его, и я знаю, что это ужасно неэффективное решение моей проблемы.В интересах пространства, я связал только первое утверждение if.Это повторяется еще 14 раз с другими результатами.

Проблема в том, что скоро у нас будет более 100 предметов, и хотя это работает на 5, я боюсь, что это будет слишком много работы и будет выполняться очень медленно для репликации.

  function onEdit(event) {
var invinput = ss.getRange("L16").getValue();
var iteminput = ss.getRange("J16").getValue();
var item1 = ss.getRange("A2").getValue();
var item2 = ss.getRange("A3").getValue();
var item3 = ss.getRange("A4").getValue();
var item4 = ss.getRange("A5").getValue();
var item5 = ss.getRange("A6").getValue();  
var inv1 = ss.getRange("B2").getValue();
var inv2 = ss.getRange("B3").getValue();  
var inv3 = ss.getRange("B4").getValue();  
var inv4 = ss.getRange("B5").getValue(); 
var inv5 = ss.getRange("B6").getValue(); 
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("invinputlog");
var itemList = ss.getRange(1,0,1000)
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  if(s.getName() == "IMI" && r.getColumn() == 14 && r.getValue() == "add" && (iteminput == item1)) {
      ss.getRange("B2").setValue(invinput+inv1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    ss.getRange("restockInput").clear();}

Я нашел много полезных решений, некоторые «для» утверждений, которые я протестировал, но я не мог понять это.

Мой вопрос заключается в том, что вместо того, чтобы сравнивать "item1 == itemInput" для каждого имеющегося у нас предмета, я бы хотел, чтобы это было что-то вроде

if iteminput == (anything in column A) {
ss.getRange("Cell B next to Cell A that matches iteminput").setValue
(invinput+"cell B that is next to cell A that matches iteminput");}

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

1 Ответ

0 голосов
/ 18 мая 2018

Если у вас будет 100 предметов, то, как вы говорите, это будет медленно.Что является медленным, так это доступ к самой электронной таблице (то, что быстрее всего, это манипулирование в памяти каждой другой «командой», которая не имеет доступа к электронной таблице).Так, например, если вы напишите сценарий для выполнения ss.getRange ("A3"). GetValue () сто раз, тогда это будет медленно.

Если бы я подошел к вашей проблеме со сценариями, яизвлек бы все значения, которые есть в электронной таблице, только один раз (конечно, на onEdit), используя что-то вроде var values = sheet.getDataRange().getValues();

. Это создаст двумерный массив типа

[
 [A1,   B1,   C1,   ... L1  ],
 [A2,   B2,   C2,   ... L2  ],
...
...
 [A100, B100, C100, ... L100]
]

У вас есть «внешний» массив, который содержит несколько «внутренних» массивов, каждый из которых представляет строку листа, от первой † строки до последней строки, где есть любая ячейка, содержащая данные, и такой же ширины, как первый † столбец допоследний столбец с любой ячейкой с данными (каждая пустая ячейка между ними также будет в массиве, который будет представлен пустой строкой '')

† .getDataRange () определяет диапазон от первой до последней-с данными, как указано выше.Вы также можете использовать другие определения диапазона, например, getRange («A1: L100»);тем не менее, 2D-характер этого диапазона и, следовательно, .getValues ​​() все еще будет там.

Тогда вам придется манипулировать этим 2D-массивом в скрипте приложений Google.Вы можете выполнить поиск в Google для цикла в javascript ИЛИ в скрипте приложений Google , чтобы показать вам код, который будет выглядеть следующим образом:

for (var i = 0; i<values.length; i ++){
// YOUR CODE to manipulate this for..loop
}

Переменная i в этой переменной for..loop увеличивает каждый циклчерез ваш код;таким образом, это аналог каждой строки (за исключением того, что он начинается с нуля, т.е. на единицу меньше строки, начинающейся с 1)Поэтому вы будете использовать i для ссылки на каждую строку в значениях.И у вас будет, во втором измерении, 0 как ColA, 1 как ColB и т. Д. До 11 как ColL, например, в четвертом цикле я буду равен 3, поэтому values[i][1] будет ссылаться на ячейку B4.
Таким образом, содна или несколько строк кода в for..loop, используя i, вы можете сравнить 100 (или много больше) строк.

Вы бы сделали if сравнение как часть ВАШЕГО КОДАв течение ...Когда сравнение if находит совпадение, вы должны остановить цикл, используя оператор break .Это исправит переменную i, которую вы затем сможете использовать в большем количестве скриптов ниже for..loop для обратной записи в электронную таблицу.Для этого я хотел бы рассмотреть возможность использования сценария google apps range.offset

(Примечание: ваш фактический вариант использования может быть более сложным, чем я указал выше, особенно в коде, который вам понадобитсянаписать для достижения требуемого сравнения (if внутри цикла). Однако вашему решению почти наверняка потребуется вызов getValues ​​() к электронной таблице, чтобы не делать 100 вызовов getValue (), и, таким образом, вам придетсяработа с 2D массивами.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...