-
שלום
אני מנסה לבנות קוד שבכל רענון יוריד את כל תוכן הטבלה שבמסד נתונים לטבלה בגוגל שיטס
החלק של הקוד שמכניס לגוגל שיטס פועל מצויין לבד, וגם החלק שמוציא מההמסד נתונים פועל טוב לבד.
אבל כשאני מחבר אותם יחד, נכנסת רק השורה הראשונה של המסד לטבלה של גוגל שיטס ואז אני מקבל שגיאה:atal error: Uncaught Error: Call to undefined method Google\Service\Sheets\AppendValuesResponse::fetch_assoc()
זה הקוד שלי:
קובץ login.php<?php require __DIR__ . '/google-api-php-client/vendor/autoload.php'; // Returns an authorized API client. // @return Google_Client the authorized client object $client = new Google_Client(); $client->setApplicationName('Google Sheets API PHP Quickstart'); $client->setScopes(Google_Service_Sheets::SPREADSHEETS); $client->setAuthConfig('key.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Get the API client and construct the service object. $service = new Google_Service_Sheets($client); $information_Id = 'XXXXXX'; $information_sheet = 'XXXX'; //שליחה למסד נתונים $servername = "localhost"; $username = "XXXX"; $password = "XXXX"; $dbname = "XXXX"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } ?>
קובץ ראשי:
<?php include 'login.php'; //מסד נתונים $sql = "SELECT * FROM `Main_Database_1`"; $result = $conn->query($sql); if ($result->num_rows > 0){ while($row = $result->fetch_assoc()){ //$id_row = $row["id"]; $date_row = $row["date"]; $Type_Activity_row = $row["Type_Activity"]; $Distance_km_row = $row["Distance_km"]; $activity_row = $row["activity"]; $Program_ID_row = $row["Program_ID"]; $Duration_activity_row = $row["Duration_activity"]; $Student_name_row = $row["Student_name"]; $Activity_Other_row = $row["Activity_Other"]; $Beginning_time_row = $row["Beginning_time"]; $End_time_row = $row["End_time"]; $Teacher_ID_row = $row["Teacher_ID"]; //גוגל שיטס $spreadsheetId = $information_Id; //הכנס נתןנים חדשים לפי שורה אחת מתחת $range = $information_sheet; $values = [ [ $date_row, $Type_Activity_row, $Distance_km_row, $activity_row, $Program_ID_row, $Duration_activity_row, $Student_name_row, $Activity_Other_row, $Beginning_time_row, $End_time_row, $Teacher_ID_row ], // Additional rows ... ]; $body = new Google_Service_Sheets_ValueRange([ 'values' => $values ]); $params = [ 'valueInputOption' => 'RAW' ]; $insert = [ 'insertDataOption' => 'INSERT_ROWS' ]; $result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params, $insert); printf("%d תאים מצורפים.", $result->getUpdates()->getUpdatedCells()); } echo "<html><h1>נשלח בהצלחה!</h1><html>"; }; mysqli_close($conn); ?>
-
-
-
@GOOGL אמר בבעיה בהורדת נתונים מ SQL לגוגל שיטס:
fetch_assoc
הבעיה היא השימוש הכפול במשתנה $result. השורות הבאות גורמות למשתנה $result שעד עכשיו החזיק תוצאות מסד נתונים עם המתודה fetch_assoc להידרס עם נתוני התשובה של גוגל, וממילא אין מקום לקריאה חוזרת לfetch_assoc:
$result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params, $insert); printf("%d תאים מצורפים.", $result->getUpdates()->getUpdatedCells());
שנה בשורות אלו את $result למילה כמו $result_google.
-
קוד קומפקטי לטעמי:
<?php include 'login.php'; //מסד נתונים $sql = "SELECT * FROM `Main_Database_1`"; $result = $conn->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { //גוגל שיטס $spreadsheetId = $information_Id; //הכנס נתןנים חדשים לפי שורה אחת מתחת $range = $information_sheet; $body = new Google_Service_Sheets_ValueRange([ 'values' => [ [ $row["date"], $row["Type_Activity"], $row["Distance_km"], $row["activity"], $row["Program_ID"], $row["Duration_activity"], $row["Student_name"], $row["Activity_Other"], $row["Beginning_time"], $row["End_time"], $row["Teacher_ID"] ], ] ]); $params = ['valueInputOption' => 'RAW']; $insert = ['insertDataOption' => 'INSERT_ROWS']; $result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params, $insert); printf("%d תאים מצורפים.", $result->getUpdates()->getUpdatedCells()); } echo "<html><h1>נשלח בהצלחה!</h1><html>"; }; mysqli_close($conn);
-
@dovid
זה עובד, אבל עכשיו בעצם הוא לא מאפשר יותר מ 100 בקשות לדקה...
זה בעיה
מה נראה לך כדאי לעשות, אולי להשהות את הקוד דקה?Fatal error: Uncaught Google\Service\Exception: { "error": { "code": 429, "message": "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'sheets.googleapis.com' for consumer
-
@GOOGL אמר בבעיה בהורדת נתונים מ SQL לגוגל שיטס:
Fatal error: Uncaught Google\Service\Exception: { "error": { "code": 429, "message": "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'sheets.googleapis.com' for consumer
-
@GOOGL תנסה את הקוד הבא:
<?php include 'login.php'; //מסד נתונים $sql = "SELECT * FROM `Main_Database_1`"; $result = $conn->query($sql); if ($result->num_rows > 0) { $values = array(); while ($row = $result->fetch_assoc()) { $values[] = [ $row["date"], $row["Type_Activity"], $row["Distance_km"], $row["activity"], $row["Program_ID"], $row["Duration_activity"], $row["Student_name"], $row["Activity_Other"], $row["Beginning_time"], $row["End_time"], $row["Teacher_ID"] ]; } $spreadsheetId = $information_Id; $range = $information_sheet; $body = new Google_Service_Sheets_ValueRange(['values' => $values]); $params = ['valueInputOption' => 'RAW']; $insert = ['insertDataOption' => 'INSERT_ROWS']; $result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params, $insert); printf("%d תאים מצורפים.", $result->getUpdates()->getUpdatedCells()); echo "<html><h1>נשלח בהצלחה!</h1><html>"; }; mysqli_close($conn);
ותעשה אולי LIMIT לשאילתה, כי הכל עולה בבת אחת לזיכרון והPHP יכול לקרוס.
-
@GOOGL הוצאתי את פעולת ההכנסה לגוגל שיטס מהלולאה, כלומר במקום שהקריאה לגוגל תתבצע שוב ושוב כמספר השורות היא מתבצעת פעם אחת בלבד אחרי שמילאנו מערך בכל השורות (מערך של מערכים).
הבעיה בפתרון הזה הוא א) הזיכרון, נוצר מערך גדול על הזיכרון של המכונה ב) גודל הבקשה הופך לענק ועלול להיכשל בגלל בעיות ברשת או איטיות.
אם הבעיות האלו יצוצו הפתרון הוא לשלוח במנות קטנות, עם לולאה שמריצה כל פעם משפט SQL עם הגבלה עם האופרטורים LIMIT + OFFSET.
אם כל שליחה תכלול 400 שורות, אז 100 בקשות יספיקו ל40 אלף שורות. -