עדכון של טופס או בוחן

כדי להוסיף תוכן לטופס או לעדכן את ההגדרות, את המטא-נתונים או את התוכן, צריך להשתמש בשיטה batchUpdate(). בשיטה הזו, כל השינויים מקובצים יחד באצווה כך שאם בקשה אחת תיכשל, אף אחד מהשינויים האחרים (שעשויים להיות תלויים בו) לא ייכתב.

השיטה batchUpdate() מחזירה גוף תגובה, שבתוכו יש תגובה לכל בקשה. לכל תגובה יש אינדקס זהה לזה של הבקשה המתאימה. בבקשות ללא תגובה רלוונטית, התשובה באינדקס הזה תהיה ריקה.

לפני שמתחילים

בצעו את המשימות הבאות לפני שתמשיכו במשימות שבדף הזה:

  • יש להשלים את הגדרת ההרשאה/האימות ופרטי הכניסה בהוראות של תוכנית שימוש מוקדם

עדכון מטא-נתונים, הגדרות או פריטים

בדוגמה הבאה תוכלו לראות איך מעדכנים מטא-נתונים של טופס, אבל המבנה של התוכן זהה לזה של התוכן וההגדרות – משתמשים בבקשות updateItem או updateSettings במקום updateFormInfo. לכל בקשה צריך לספק את שם השדה שרוצים לשנות ואת הערך המעודכן, לצד ערך של updateMask להגבלת השינויים בשדות שציינתם.

REST

כדי לעדכן את התיאור של הטופס, צריך לבצע קריאה ל-method batchUpdate() עם מזהה הטופס ועם ערך התיאור המעודכן.

גוף הבקשה לדוגמה

    "requests": [{
        "updateFormInfo": {
            "info": {
                "description": "Please complete this quiz based on this week's readings for class."
            },
            "updateMask": "description"
        }
    }]

Python

forms/snippets/update_form.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/forms.body"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secrets.json", SCOPES)
  creds = tools.run_flow(flow, store)

form_service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

form = {
    "info": {
        "title": "Update metadata example for Forms API!",
    }
}

# Creates the initial Form
createResult = form_service.forms().create(body=form).execute()

# Request body to add description to a Form
update = {
    "requests": [
        {
            "updateFormInfo": {
                "info": {
                    "description": (
                        "Please complete this quiz based on this week's"
                        " readings for class."
                    )
                },
                "updateMask": "description",
            }
        }
    ]
}

# Update the form with a description
question_setting = (
    form_service.forms()
    .batchUpdate(formId=createResult["formId"], body=update)
    .execute()
)

# Print the result to see it now has a description
getresult = form_service.forms().get(formId=createResult["formId"]).execute()
print(getresult)

Node.js

forms/snippets/update_form.js
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

async function runSample(query) {
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const forms = google.forms({
    version: 'v1',
    auth: authClient,
  });
  const newForm = {
    info: {
      title: 'Creating a new form for batchUpdate in Node',
    },
  };
  const createResponse = await forms.forms.create({
    requestBody: newForm,
  });
  console.log('New formId was: ' + createResponse.data.formId);

  // Request body to add description to a Form
  const update = {
    requests: [
      {
        updateFormInfo: {
          info: {
            description:
              'Please complete this quiz based on this week\'s readings for class.',
          },
          updateMask: 'description',
        },
      },
    ],
  };
  const res = await forms.forms.batchUpdate({
    formId: createResponse.data.formId,
    requestBody: update,
  });
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

הוספת פריט

הדוגמה הבאה מראה איך להוסיף תוכן חדש לטופס. כשמוסיפים תוכן חדש, צריך לספק מיקום עם אינדקס שאליו יתווסף תוכן חדש. לדוגמה, מיקום עם אינדקס 0 יוסיף את התוכן בתחילת הטופס.

REST

כדי להוסיף פריט לטופס, צריך לבצע קריאה ל-method batchUpdate(), ולציין בו את מזהה הטופס ואת פרטי הפריט והמיקום הרצוי.

גוף הבקשה לדוגמה

"requests": [{
    "createItem": {
        "item": {
            "title": "Homework video",
            "description": "Quizzes in Google Forms",
            "videoItem": {
                "video": {
                     "youtubeUri": "https://www.youtube.com/watch?v=Lt5HqPvM-eI"
                }
            }},
        "location": {
          "index": 0
        }
}]

Python

forms/snippets/add_item.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/forms.body"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secrets.json", SCOPES)
  creds = tools.run_flow(flow, store)

form_service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

form = {
    "info": {
        "title": "Update item example for Forms API",
    }
}

# Creates the initial Form
createResult = form_service.forms().create(body=form).execute()

# Request body to add a video item to a Form
update = {
    "requests": [
        {
            "createItem": {
                "item": {
                    "title": "Homework video",
                    "description": "Quizzes in Google Forms",
                    "videoItem": {
                        "video": {
                            "youtubeUri": (
                                "https://www.youtube.com/watch?v=Lt5HqPvM-eI"
                            )
                        }
                    },
                },
                "location": {"index": 0},
            }
        }
    ]
}

# Add the video to the form
question_setting = (
    form_service.forms()
    .batchUpdate(formId=createResult["formId"], body=update)
    .execute()
)

# Print the result to see it now has a video
result = form_service.forms().get(formId=createResult["formId"]).execute()
print(result)

Node.js

forms/snippets/add_item.js
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

async function runSample(query) {
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const forms = google.forms({
    version: 'v1',
    auth: authClient,
  });
  const newForm = {
    info: {
      title: 'Creating a new form for batchUpdate in Node',
    },
  };
  const createResponse = await forms.forms.create({
    requestBody: newForm,
  });
  console.log('New formId was: ' + createResponse.data.formId);

  // Request body to add video item to a Form
  const update = {
    requests: [
      {
        createItem: {
          item: {
            title: 'Homework video',
            description: 'Quizzes in Google Forms',
            videoItem: {
              video: {
                youtubeUri: 'https://www.youtube.com/watch?v=Lt5HqPvM-eI',
              },
            },
          },
          location: {
            index: 0,
          },
        },
      },
    ],
  };
  const updateResponse = await forms.forms.batchUpdate({
    formId: createResponse.data.formId,
    requestBody: update,
  });
  console.log(updateResponse.data);
  return updateResponse.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

שליחת בקשה להזמנה

השיטה batchUpdate() מקבלת מערך של בקשות משנה, כמו createItem ו-updateItem. מתבצע אימות של בקשות משנה בנפרד, לפי הסדר שבו הן סופקו.

דוגמה: בקשת batchUpdate מכילה מערך requests עם שתי בקשות משנה של createItem. בבקשת המשנה א' יש location.index 0, ובבקשת המשנה ב' יש location.index 1. אם המערך requests הוא [A, B], batchUpdate יצליח. אם המערך הוא [B, A], batchUpdate ייכשל, מכיוון ש-location.index 1 לא חוקי אלא אם הטופס כבר מכיל פריט באינדקס 0.