Поиск по таблице

littleKongo

Client
Регистрация
17.01.2015
Сообщения
244
Благодарностей
24
Баллы
18
Есть название конкретного аккаунта. В отдельной таблице есть массив аккаунтов с доп инфой. Необходимо найти строку, в которой это название написано. Столбец для поиска всегда А. Как такое сделать? Стандартными средствами никак не получается. Подскажите , пожалуйста
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
перебрать таблицу можно и стандартными средствами
 

littleKongo

Client
Регистрация
17.01.2015
Сообщения
244
Благодарностей
24
Баллы
18
Ну это будет в разы дольше
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ну кроме как перебор в коде у меня идей, к сожалению, нет
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
  • Спасибо
Реакции: Джек Воробей

littleKongo

Client
Регистрация
17.01.2015
Сообщения
244
Благодарностей
24
Баллы
18
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["tableSearchTextContains"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["SourceTable"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // проверяем первую ячейку регулярным выражением, если есть совпадение кладем результат во вторую таблицу
        if (parserRegex.IsMatch(cells[1]))
            destTable.AddRow(cells.Union(additionalTable.GetRow(0)));
    }
}
Нашел похожий вариант. Только мне нужно, чтобы возвращало в переменную номер строки, в которой найдено, а если не найдено, то "no"
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
destTable.AddRow(cells.Union(additionalTable.GetRow(0))); замени на return i;
в самом конце пропиши return "no";
 

littleKongo

Client
Регистрация
17.01.2015
Сообщения
244
Благодарностей
24
Баллы
18
destTable.AddRow(cells.Union(additionalTable.GetRow(0))); замени на return i;
в самом конце пропиши return "no";
Спасибо, получилось. А как сделать, чтобы весь второй стобец, там больше 100 значений в список записался?
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18

sneex

Новичок
Регистрация
02.02.2019
Сообщения
1
Благодарностей
4
Баллы
3
Рабочий код если нужно вернуть номер строки.

// берем из переменной текст, который надо искать
var textContains = project.Variables["Category_ID"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["IDTable"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
for(int i=0; i < sourceTable.RowCount; i++)
{
// читаем строку из таблицы (это будет массив ячеек)
var cells = sourceTable.GetRow(i).ToArray();
// пройдем в цикле по всем ячейкам
for (int j=0; j < cells.Length; j++)
{
// проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
if (cells[j].Contains(textContains))
return i;
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
  • Спасибо
Реакции: ukrainec2014

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28
// берем из переменной текст, который надо искать
var textContains = project.Variables["Category_ID"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.Tables["IDTable"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
for(int i=0; i < sourceTable.RowCount; i++)
{
// читаем строку из таблицы (это будет массив ячеек)
var cells = sourceTable.GetRow(i).ToArray();
// пройдем в цикле по всем ячейкам
for (int j=0; j < cells.Length; j++)
{
// проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
if (cells[j].Contains(textContains))
return i;
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
с гугл таблицами получается такой ответ

Выполнение действия CSharp OwnCode. Sequence contains no matching element
как можно поправить?
 
  • Спасибо
Реакции: Rimen

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
351
Благодарностей
52
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: ukrainec2014

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Может подскажете еще по гугл табличкам? очень надо.. буду признателен...
Не нашел решение, сделал костыль: столбец таблицы загоняю в список и ищу по списку номер в каждом цикле. Жесть как неуниверсально, но функционал нужный выполняет
 
  • Спасибо
Реакции: ukrainec2014

Develop3r

Новичок
Регистрация
25.11.2020
Сообщения
17
Благодарностей
6
Баллы
3
Не нашел решение, сделал костыль: столбец таблицы загоняю в список и ищу по списку номер в каждом цикле. Жесть как неуниверсально, но функционал нужный выполняет
Если что, вот тоже решение, но с поиском по списку через c#
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
с гугл таблицами получается такой ответ



как можно поправить?
Оказывается всё до безобразия просто
Вместо
C#:
var sourceTable = project.Tables["IDTable"];
Нужно
C#:
var sourceTable = project.GoogleSpreadsheets["IDTable"];

C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["Category_ID"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.GoogleSpreadsheets["IDTable"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
for(int i=0; i < sourceTable.RowCount; i++)
{
// читаем строку из таблицы (это будет массив ячеек)
var cells = sourceTable.GetRow(i).ToArray();
// пройдем в цикле по всем ячейкам
for (int j=0; j < cells.Length; j++)
{
// проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
if (cells[j].Contains(textContains))
return i;
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
 

Develop3r

Новичок
Регистрация
25.11.2020
Сообщения
17
Благодарностей
6
Баллы
3
Оказывается всё до безобразия просто
Вместо
C#:
var sourceTable = project.Tables["IDTable"];
Нужно
C#:
var sourceTable = project.GoogleSpreadsheets["IDTable"];

C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["Category_ID"].Value;
// получаем таблицу, в которой будем искать
var sourceTable = project.GoogleSpreadsheets["IDTable"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
for(int i=0; i < sourceTable.RowCount; i++)
{
// читаем строку из таблицы (это будет массив ячеек)
var cells = sourceTable.GetRow(i).ToArray();
// пройдем в цикле по всем ячейкам
for (int j=0; j < cells.Length; j++)
{
// проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
if (cells[j].Contains(textContains))
return i;
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
Благодарствую
 

alexzver

Client
Регистрация
28.12.2015
Сообщения
59
Благодарностей
10
Баллы
8
Периодически начинает выдавать ошибку с Google Sheets:
Ссылка на объект не указывает на экземпляр объекта.

Кто-нибудь знает как решить?

(Таблица в настройках подключена, строка для поиска не пустая)

P.S. при том он может начать выдавать и перестать выдавать эту ошибку абсолютно сам без каких-то действий с моей стороны.
 
Последнее редактирование:

Кто просматривает тему: (Всего: 5, Пользователи: 0, Гости: 5)