前提
他の関数に入っている変数を呼び出したいのですがうまいこといきません。
ここに質問の内容を詳しく書いてください。
実現したいこと
現在、Googleアナリティクスからデータを引っ張ってきてスプレットシートに貼り付けるといったプログラムを作成しています。
以下のコードはday_startとday_endを指定してあげると期間内のデータを1日毎にデータを取得していくといった流れになっています。
python
1n = 0 2today = datetime.date.today() 3day_start = datetime.datetime.strptime(input("データ取得始めの日付を入力してください。(例:20230120)"),"%Y%m%d").date() 4day_end = datetime.datetime.strptime(input("データ取得最終日を入力してください。(例:20230120)"),"%Y%m%d").date() 5day_diff = day_end -day_start 6 7# サービスアカウントキーファイルを使用した認証 8def initialize_analytics_reporting(): 9 credentials = service_account.Credentials.from_service_account_file(KEY_FILE_LOCATION) 10 scoped_credentials = credentials.with_scopes(SCOPES) 11 return build("analyticsreporting", "v4", credentials=scoped_credentials) 12 13 14def get_report(analytics, next_page_token="0"): 15# 設定に関してはhttps://ga-dev-tools.web.app/dimensions-metrics-explorer/を参照20 16 day_start_date = date_period() 17 request_body = { 18 "reportRequests": [{ 19 "viewId": VIEW_ID, 20 "pageSize": 10000, 21 "pageToken": next_page_token, 22 "dateRanges": [{'startDate': f'{day_start_date}', 'endDate': f'{day_start_date}'}], 23 "metrics": [{"expression": "ga:pageviews"},{'expression':"ga:sessions"}], 24 # "dimensions": [{"name": "ga:pagePath"}, {"name": "ga:pageTitle"}], 25 "orderBys": [{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}] 26 }] 27 } 28 return analytics.reports().batchGet(body=request_body).execute() 29 30 31def get_response(response): 32 rows = [] 33 for report in response.get("reports", []): 34 # pprint(report) 35 column_header = report.get("columnHeader", {}) 36 dimension_headers = column_header.get("dimensions", []) 37 metric_headers = column_header.get("metricHeader", {}).get("metricHeaderEntries", []) 38 next_page_token = report.get('nextPageToken') 39 40 for row in report.get("data", {}).get("rows", []): 41 row_data = {} 42 dimensions = row.get("dimensions", []) 43 date_range_values = row.get("metrics", []) 44 for header, dimension in zip(dimension_headers, dimensions): 45 row_data[header] = dimension 46 for i, values in enumerate(date_range_values): 47 for metricHeader, value in zip(metric_headers, values.get("values")): 48 row_data[metricHeader.get("name")] = value 49 rows.append(row_data) 50 # pprint(row) 51 return rows, next_page_token 52 53def date_period(): 54 n = 0 55 if day_diff.days == 0: 56 print(f"{day_start}だけのデータを取得します。") 57 main() 58 elif (day_diff.days > 0) and (day_end == today): 59 n = 0 60 print(f"{day_start}から今日までを取得します。") 61 for i in range((today-day_start).days,(today - day_start+day_diff).days +1): 62 day_count = day_start + datetime.timedelta(days = n) 63 day_start_date = day_start+ datetime.timedelta(days = n) 64 print(f"{day_count}のデータを取得") 65 n +=1 66 main() 67 time.sleep(2) 68 return day_start_date 69 70 71 else: 72 n = 0 73 print(f"{day_start}から{day_end}までのデータを取得") 74 for i in range((today-day_start).days,(today - day_start+day_diff).days +1): 75 day_count = day_start + datetime.timedelta(days = n) 76 day_start_date = day_start+ datetime.timedelta(days = n) 77 print(f"{day_count}のデータを取得") 78 n +=1 79 main() 80 time.sleep(2) 81 return day_start_date 82 83def main(): 84 analytics = initialize_analytics_reporting() 85 print_response(analytics) 86 time.sleep(2) 87 return print_response(analytics) 88 89 90if __name__ == "__main__": 91 date_period() 92 # a =date_period() 93 # print(a) 94 print(__name__) 95 96
get_report関数内が実行された時、16行目のday_start_dateはdate_period関数内のreturnで返されたday_start_dateが入ってくる想定でした。
しかし、実行してみると無限ループに陥ってしまいます。
どのようにすればget_report関数内のday_start_dateをdate_period関数内で呼び出すことができるでしょうか。
読みにくいコードになっているかもしれませんが確認よろしくお願い致します。
試したこと
rerturnの場所を変えてみるなど試しました。
また、global n とし宣言してあげるようなものを追記してみたり。
回答1件
あなたの回答
tips
プレビュー