Проблема с обработкой пользовательских событий надстройки рабочей области Google
Это очень сложно. Я прошу прощения....
Я создаю надстройку рабочей области Google, которая позволяет:
- Выберите файл.
- Задайте имя для этого файла на основе набора пользовательских данных.
Я столкнулся с рядом проблем.
- Во-первых, когда я выбираю файл после того, как он проходит через процесс авторизации, он часто выдает мне « Контент недоступен для этого сообщения » на боковой панели. Я не могу понять, зачем он это делает. Я ожидаю, что он просто покажет виджеты с различными параметрами пользовательского ввода.
- Во-вторых, я не могу записывать или регистрировать какие-либо данные, введенные пользователем. Вы можете видеть, как я пытаюсь вызвать их как переменные в функции onSearch, а затем записать их в имя файла.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация для решения проблем. Прошу прощения за беспорядок в коде. Это относительно новая функция в Google, и я в основном только что изменял код из примеров надстроек, поэтому есть некоторые рудиментарные переменные и т. Д.
// See https://github.com/contributorpw/lodashgs
var _ = LodashGS.load();
/**
* Renders the home page for the add-on. Used in all host apps when
* no context selected.
*
* @param {Object} event - current add-on event
* @return {Card[]} Card(s) to display
*/
function onHomePage(event) {
var card = buildSearchCard_();
return [card];
}
/**
* Renders the contextual interface for a selected Drive file.
*
* @param {Object} event - current add-on event
* @return {Card[]} Card(s) to display
*/
function onDriveItemsSelected(event) {
// For demo, only allow single select on files.
if (event.drive.selectedItems.length != 1) {
var message = "To set a file name, select one file only.";
var card = buildSearchCard_(message);
return [card];
}
var selectedItem = event.drive.selectedItems[0];
if (!selectedItem.addonHasFileScopePermission) {
// Need file access to read ACL, ask user to authorize.
var authorizeFilesAction = CardService.newAction()
.setFunctionName("onAuthorizeDriveFiles")
.setLoadIndicator(CardService.LoadIndicator.SPINNER)
.setParameters({id: selectedItem.id});
var authorizationMessage = CardService.newTextParagraph()
.setText("To change your file name, give permission to the tool to do so.");
var authorizeButton = CardService.newTextButton()
.setText("Authorize")
.setOnClickAction(authorizeFilesAction);
var card = CardService.newCardBuilder()
.addSection(CardService.newCardSection()
.addWidget(authorizationMessage)
.addWidget(authorizeButton))
.build();
return [card];
}}
/**
// Have access, extract ACLs to find co-workers
var emails = extractEmailsFromDrivePermissions_(event);
var people = fetchPeople_(emails);
if (people.length == 0) {
var card = buildSearchCard_("");
return [card];
}
var card = buildTeamListCard_(people)
return [card];
}
/**
* Handles the click for requesting drive file access.
*
* @param {Object} event - current add-on event
* @return {ActionResponse} Request to authorize access to a drive item
*/
function onAuthorizeDriveFiles(event) {
var id = event.parameters.id;
return CardService.newDriveItemsSelectedActionResponseBuilder()
.requestFileScope(id)
.build();
}
/**
* Handles the user search request.
*
* @param {Object} event - current add-on event
* @return {Card[]} Card(s) to display
*/
function handleDateChange(event) {
var dateTimeInput =
event.commonEventObject.formInputs["myDateTimePickerWidgetID"];
var hasDate = dateTimeInput.hasDate;
// The following requires you to configure the add-on to read user locale
// and timezone.
// See https://developers.google.com/gsuite/add-ons/how-tos/access-user-locale
var userTimezoneId = event.userTimezone.id;
// Format and log the date-time selected using the user's timezone.
var formattedDateTime;
if (hasDate) {
formattedDateTime = Utilities.formatDate(
new Date(hasDate), userTimezoneId, "yyy/MM/dd hh:mm:ss");
} else if (hasDate) {
formattedDateTime = Utilities.formatDate(
new Date(hasDate), userTimezoneId, "yyy/MM/dd")
+ ", Time unspecified";
}
if (formattedDateTime) {
console.log(formattedDateTime);
}
}
function onSearch(event) {
if (!event.formInputs || !event.formInputs.query) {
var notification = CardService.newNotification()
.setText("Enter file name components");
return CardService.newActionResponseBuilder()
.setNotification(notification)
.build();
}
var itemId = event.drive.selectedItems[0].id;
var targetFile = DriveApp.getFileById(itemId)
// var query = event.formInputs.query[0];
var dateOnlyPicker =
event.commonEventObject.formInputs.dateOnlyPicker[""].stringInputs.value[0];
var description = event.commonEventObject.formInputs.description[""].stringInputs.value[0];
var department = event.commonEventObject.formInputs.department[""].stringInputs.value[0];
targetFile.setName(dateOnlyPicker +"-"+ description +"-"+ department);
Logger.log(dateOnlyPicker)
Logger.log(description)
Logger.log(department)
// var people = queryPeople_(query);
}
/**
/**
* Builds the search interface for looking up people.
*
* @param {string} opt_error - Optional message to include (typically when
* contextual search failed.)
* @return {Card} Card to display
*/
function buildSearchCard_(opt_error) {
//var banner = CardService.newImage()
//.setImageUrl('https://storage.googleapis.com/gweb-cloudblog-publish/original_images/Workforce_segmentation_1.png');
var dateOnlyPicker = CardService.newDatePicker()
.setTitle("Enter the date.")
.setFieldName("date_field")
// Set default value as May 24 2019. Either a
// number or string is acceptable.
.setValueInMsSinceEpoch(1558668600000)
.setOnChangeAction(CardService.newAction()
.setFunctionName("handleDateChange"));
var description = CardService.newTextInput()
.setFieldName("description")
.setHint("description")
.setTitle("description");
var department = CardService.newSelectionInput()
.setType(CardService.SelectionInputType.DROPDOWN)
.addItem("checkbox one title", "checkbox_one_value", false)
.addItem("checkbox two title", "checkbox_two_value", true)
.addItem("checkbox three title", "checkbox_three_value", true)
.setFieldName("department")
.setTitle("department");
var onSubmitAction = CardService.newAction()
.setFunctionName("onSearch")
.setLoadIndicator(CardService.LoadIndicator.SPINNER);
var submitButton = CardService.newTextButton()
.setText("Set File Name")
.setOnClickAction(onSubmitAction);
var section = CardService.newCardSection()
// .addWidget(banner)
.addWidget(dateOnlyPicker)
.addWidget(description)
.addWidget(department)
.addWidget(submitButton);
if (opt_error) {
var message = CardService.newTextParagraph()
.setText("Note: " + opt_error);
section.addWidget(message);
}
return CardService.newCardBuilder()
.addSection(section)
.build();
}
/**
Вот манифест json, чтобы вы могли его полностью протестировать.
Вот журнал, согласно первому предложению в первом комментарии. У меня тоже возникли проблемы с его расшифровкой.
[21-02-04 14:44:15:004 EST] Starting execution
[21-02-04 14:44:15:154 EST] CardService.newDatePicker() [0 seconds]
[21-02-04 14:44:15:154 EST] CardService.DatePicker.setTitle([Enter the date.]) [0 seconds]
[21-02-04 14:44:15:154 EST] CardService.DatePicker.setFieldName([date_field]) [0 seconds]
[21-02-04 14:44:15:154 EST] CardService.DatePicker.setValueInMsSinceEpoch([1.5586686E12]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.newAction() [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.Action.setFunctionName([handleDateChange]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.DatePicker.setOnChangeAction([Action]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.newTextInput() [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.TextInput.setFieldName([description]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.TextInput.setHint([description]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.TextInput.setTitle([description]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.newSelectionInput() [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.SelectionInput.setType([DROPDOWN]) [0 seconds]
[21-02-04 14:44:15:155 EST] CardService.SelectionInput.addItem([checkbox one title, checkbox_one_value, false]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.SelectionInput.addItem([checkbox two title, checkbox_two_value, true]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.SelectionInput.addItem([checkbox three title, checkbox_three_value, true]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.SelectionInput.setFieldName([department]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.SelectionInput.setTitle([department]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.newAction() [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.Action.setFunctionName([onSearch]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.Action.setLoadIndicator([SPINNER]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.newTextButton() [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.TextButton.setText([Set File Name]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.TextButton.setOnClickAction([Action]) [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.newCardSection() [0 seconds]
[21-02-04 14:44:15:156 EST] CardService.CardSection.addWidget([DatePicker]) [0 seconds]
[21-02-04 14:44:15:157 EST] CardService.CardSection.addWidget([TextInput]) [0 seconds]
[21-02-04 14:44:15:157 EST] CardService.CardSection.addWidget([SelectionInput]) [0 seconds]
[21-02-04 14:44:15:157 EST] CardService.newCardBuilder() [0 seconds]
[21-02-04 14:44:15:157 EST] CardService.CardBuilder.addSection([CardSection]) [0 seconds]
[21-02-04 14:44:15:157 EST] CardService.CardBuilder.build() [0 seconds]
[21-02-04 14:44:15:159 EST] Execution succeeded [0.004 seconds total runtime]
1 ответ
Это устранило мою проблему для №2. Не минимальный код, я знаю, но масштаб проекта изменился