Есть ли способ использовать функцию IMPORTXML в Google Sheets для импорта двух запросов одновременно? - PullRequest
1 голос
/ 12 апреля 2019

В Google Sheets я работаю над инструментом, позволяющим связывать информацию об определенных округах Конгресса США с соответствующими членами Конгресса. Чтобы облегчить обновление информации о том, какие Представители обслуживают какие районы, я решил использовать функцию IMPORTXML для получения актуальных списков Членов и округов.

К счастью, клерк Палаты представителей США публикует обновленный xml-файл , содержащий всю необходимую мне информацию. Хотя я все еще пытаюсь справиться с запросами xpath в Sheets, я думаю, что у меня есть довольно простое представление о том, как применить его для этого проекта. Я обнаружил, что могу использовать следующую функцию для получения информации о штате и округе:

=IMPORTXML("http://clerk.house.gov/xml/lists/MemberData.xml","//member/statedistrict")

И вот данные, которые возвращает функция:

here's a link because I'm not allowed to embed images yet

Очевидно, что результаты продолжаются для всех 435 округов (на самом деле 441, потому что это включает и делегатов без права голоса), и я могу работать с этим. Проблемы, с которыми я сталкиваюсь, это когда я пытаюсь импортировать имена членов палаты с помощью следующей функции:

=IMPORTXML("http://clerk.house.gov/xml/lists/MemberData.xml","//member/member-info/namelist")

И вот что возвращает эта функция:

again, link because I can't embed yet

И снова результаты продолжаются и включают каждого Участника. НО, в настоящее время в палате нет 435 членов (441 включая делегатов) из-за некоторых вакансий. А функция IMPORTXML, которая извлекает имена членов, возвращает только 438 имен, которые она может найти.

Это означает, что я не могу легко связать Участника с районом, просто используя два вызова IMPORTXML в двух смежных столбцах (один с государством / районом, другой с именами), поскольку списки не выстраиваются, что можно увидеть в нижней части столбцов:

here you can see the bottom of the columns

Я немного покопался и узнал, что могу использовать два запроса xpath в одном вызове IMPORTXML, добавив | между запросами. При этом с запросами xpath из предыдущих функций вызов IMPORTXML выглядит следующим образом:

=IMPORTXML("http://clerk.house.gov/xml/lists/MemberData.xml","//member/statedistrict | //member/member-info/namelist")

И он возвращает один столбец, в котором штат / район чередуются с такими именами:

here's a link to the image of the double query

Интересно, что когда я это делаю, имена соотносятся с их районами; когда появляется вакансия, функция импортирует район, пропускает несуществующее имя, импортирует следующий район, а затем следующее имя. Таким образом, когда дело доходит до пустующего района, это выглядит так (выходные данные выделены):

in this image, you can see the skipping of names

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

1 Ответ

2 голосов
/ 12 апреля 2019

Хорошо, я думаю, что, поспав на нем, я придумал рабочее решение (это не элегантное прикосновение, но оно выполнит свою работу).

Итак, используя вызов IMPORTXML с двумяЗапросы дают правильный порядок, но не правильный интервал.В другом столбце мы можем проверить, можно ли привести последние два символа строк в каждой ячейке к числу.Если они могут, то это значение должно быть Штатом / Районом, и мы вернем это значение.Вот формула, которую я использовал:

=ARRAYFORMULA(IF(ISNUMBER(VALUE(RIGHT(E3:E,2))),E3:E,""))

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

=ARRAYFORMULA(IF(ISNUMBER(VALUE(RIGHT(E3:E,2))),"",E3:E))

Здесь вы можете видеть, как она работает;имена выстраиваются в ряд, и есть места, где есть вакансии:

link to image because I can't embed yet

А затем, чтобы исключить все лишние строки между записями, мы можем просто отфильтровать их следующим образом:

=FILTER(F3:G,F3:F<>"")

И у нас остались два столбца, один с данными штата / района, другой с именем соответствующего представителя:

enter image description here

Просто хотелобновить с тем, что я нашел в случае, если кто-то еще борется аналогичным образом.

...