C# BatchUpdateDocumentRequest ReplaceAllText Google Docs Api - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь обновить / заменить данный текст в шаблоне Google Docs .

Код, который я пробовал до сих пор:

DriveService service = GetDriveService();

var firstname = "Firstname";
var lastname = "Lastname";

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();

List<Request> requests = new List<Request>();

var repl = new Request();
var substrMatchCriteria = new SubstringMatchCriteria();
var replaceAlltext = new ReplaceAllTextRequest();
replaceAlltext.ReplaceText = firstname + "." + lastname;
substrMatchCriteria.Text = "vorname.nachname";
replaceAlltext.ContainsText = substrMatchCriteria;
repl.ReplaceAllText = replaceAlltext;

requests.Add(repl);
body.Requests = requests;


//Batch update Request requires 3 Parameters
DocumentsResource.BatchUpdateRequest bUpdate = new DocumentsResource.BatchUpdateRequest(service, body, "160NinGjrmshSga8fWkCFRwApV0FTL1BiJCidH7A1yFw");
bUpdate.Execute(); // The Exception is raised here

DocumentsResource.BatchUpdateRequest требует следующих параметров: enter image description here

Произошла следующая ошибка:

Google.GoogleApiException: "Not Found"

JsonReaderException: Error parsing NaN value. Path '', line 1, position 1.

Diese Ausnahme wurde ursprünglich bei dieser Aufrufliste ausgelöst:
Newtonsoft.Json.JsonTextReader.ParseNumberNaN(Newtonsoft.Json.ReadType, bool)
Newtonsoft.Json.JsonTextReader.ParseValue()
Newtonsoft.Json.JsonTextReader.Read()
Newtonsoft.Json.JsonReader.ReadForType(Newtonsoft.Json.Serialization.JsonContract, bool)
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonReader, System.Type, bool)
Newtonsoft.Json.JsonSerializer.DeserializeInternal(Newtonsoft.Json.JsonReader, System.Type)
Newtonsoft.Json.JsonConvert.DeserializeObject(string, System.Type, Newtonsoft.Json.JsonSerializerSettings)
Google.Apis.Services.BaseClientService.DeserializeError(System.Net.Http.HttpResponseMessage)

Я взял documentId из документа путь
enter image description here

Также файл присутствует с использованием files.list : enter image description here

Что я пропускаю / делаю неправильно?

1 Ответ

0 голосов
/ 03 марта 2020

Сначала вы можете попытаться обобщить метод GetService, я сделал это, потому что я использую различные области действия

public static object GetService(apiType api = apiType.GDrive)
    {
        UserCredential credential;

        // F: ricavo le credenziali da client_secret.json
        string CSPath = HostingEnvironment.MapPath("~/MyFolder/");

        using (var stream = new FileStream(Path.Combine(CSPath, "client_secret.json"), FileMode.Open, FileAccess.Read))
        {

            string FolderPath = CSPath;

            string FilePath = Path.Combine(FolderPath, "DriveServiceCredentials.json");

            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(FilePath, true)
                ).Result;

        }

        // F: creo materialmente il servizio
        if (api == apiType.GDocs)
        {
            DocsService docsService = new DocsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = MyApplicationName,
            });
            return docsService;
        }
        else
        {
            DriveService driveService = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = MyApplicationName
            });
            return driveService;
        }

    }

, затем вы можете попробовать что-то вроде этого:

public static void EditDoc(string fileId, Dictionary<string, string> textToReplace)
    {

        // F: carico il servizio
        DocsService service = (DocsService)GetService(apiType.GDocs);

        List<Request> requests = new List<Request>();

        foreach (var text in textToReplace)
        {
            var repl = new Request();
            var substrMatchCriteria = new SubstringMatchCriteria();
            var replaceAlltext = new ReplaceAllTextRequest();

            replaceAlltext.ReplaceText = text.Value;
            substrMatchCriteria.Text = text.Key;

            replaceAlltext.ContainsText = substrMatchCriteria;
            repl.ReplaceAllText = replaceAlltext;

            requests.Add(repl);
        }

        // F: e adesso aggiorno il file
        BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest { Requests = requests };

        service.Documents.BatchUpdate(body, fileId).Execute();

    }

Я использовал этот документ в качестве ссылки https://developers.google.com/docs/api/how-tos/merge по какой-то причине Google не перевел его в C# ...

...