Я внес несколько небольших изменений в приведенный вами пример кода, чтобы боковая панель не обновлялась периодически после интервала времени.
В основном я использовал PropertiesService для хранения строкиэто выбрано. Идея состоит в том, что скрипт проверяет, совпадают ли текущая выбранная строка и ранее выбранная строка (выбранная в последний раз getRecord
, то есть в течение последнего интервала). Если они одинаковы, выбор строки не изменился, что означает, что аудио на боковой панели не нуждается в обновлении.
Таким образом, он обновляется только при изменении выбранной строки, что, я думаю, является основной проблемой, с которой вы сталкиваетесь.
Чтобы достичь этого, ваш код должен быть изменен следующим образом(смотрите подробности об изменениях во встроенных комментариях):
getRecord ()
function getRecord() {
var scriptProperties = PropertiesService.getScriptProperties();
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var headers = data[0];
var rowNum = sheet.getActiveCell().getRow(); // Get currently selected row
var oldRowNum = scriptProperties.getProperty("selectedRow"); // Get previously selected row
if(rowNum == oldRowNum) { // Check if the was a row selection change
// Function returns the string "unchanged"
return "unchanged";
}
scriptProperties.setProperty("selectedRow", rowNum); // Update row index
if (rowNum > data.length) return [];
var record = [];
for (var col=0;col<headers.length;col++) {
var cellval = data[rowNum-1][col];
if (typeof cellval == "object") {
cellval = Utilities.formatDate(cellval, Session.getScriptTimeZone() , "M/d/yyyy");
}
record.push({ heading: headers[col],cellval:cellval });
}
return record;
}
В зависимости от того, было ли изменение выбора, getRecord
возвращает:
- a
record
массив, если выбранная строка отличается. - строка
"unchanged"
, если выбранная строка совпадает. Возможно, это не самый элегантный способ справиться с этим, но вы поняли идею.
Затем showRecord(record)
возвращает это возвращаемое значение. Если это значение является строкой "unchanged"
, она не будет обновлять боковую панель:
showRecord (запись)
function showRecord(record) {
// Checks whether returned value is `"unchanged"` (this means the row selected is the same one as before)
if (record != "unchanged" && record.length) {
for (var i = 2; i <= 2; i++) {
// build field name on the fly, formatted field-1234
var str = '' + i;
var fieldId = 'field-' + ('0000' + str).substring(str.length)
// If this field # doesn't already exist on the page, create it
if (!$('#'+fieldId).length) {
var newField = $($.parseHTML('<div id="'+fieldId+'"></div>'));
$('#sidebar-record-block').append(newField);
}
// Replace content of the field div with new record
$('#'+fieldId).replaceWith('<div id="'+fieldId+'" class="div-table-row"></div>');
$('#'+fieldId).append($('<div class="div-table-th">' + record[i].heading + '</div>'))
.append('<audio id="player" controls autoplay> <source src=' + record[i].cellval + ' type=audio/wav > Your browser does not support the audio element. </audio>');
}
}
// TODO: hide any existing fields that are beyond the current record length
//Setup the next poll
poll();
}
Я также добавил autoplay
атрибут в этой строке:
.append('<audio id="player" controls> <source src=' + record[i].cellval + ' type=audio/wav > Your browser does not support the audio element. </audio>')
, чтобы звук воспроизводился автоматически при выборе новой строки, без необходимости нажимать кнопку play
.
Наконец, я изменил poll
интервал до 500, чтобы вам не приходилось так долго ждать, пока воспроизводится новый звук. В любом случае вы можете отредактировать это так, как вам удобно:
interval = interval || 500;
Я не модифицировал оставшуюся часть сценария, хотя, вероятно, его можно улучшить, поскольку он был написан в основном для другого сценария. выпуск.
Надеюсь, это поможет.