// Inserts rows range into the existing sheet internal static async Task InsertRowsAsync(this SheetsService sheetsService, string spreadsheetId, string sheetTitleId, int?sheetId, int columnCount, int toBeInsertedTopRowIndex, int toBeInsertedRowCount, IList <IList <object> > newRowsData) { // Wait for google apis request quota availability. await SessionRequestsLimiter.Instance.WaitAsync(); // Obtain appropriate insert row batch request. SpreadsheetsResource.BatchUpdateRequest insertRowsRequest = GoogleServicesExtensionsRequestsFactory.GetInsertRowsRequest(sheetsService, spreadsheetId, sheetId, toBeInsertedTopRowIndex, toBeInsertedRowCount); // Execute insert sheet rows request in safe synchronous manner. await RequestsExecutor.SafeExecuteAsync <BatchUpdateSpreadsheetResponse>(insertRowsRequest); // If new rows data haven't been provided if (!(newRowsData is null)) { // Obtain new rows range string. string newRowsRangeString = RangeTranslator.GetRangeString(sheetTitleId, 0, toBeInsertedTopRowIndex, columnCount, toBeInsertedRowCount); // Fills inserted rows with provided data. await sheetsService.UpdateRangeDataAsync(spreadsheetId, newRowsRangeString, newRowsData); } }