- 
      
- 
        Save westonkd/7aa5a9da24d3360084c2d9fa47f71a88 to your computer and use it in GitHub Desktop. 
| // Main function | |
| function backupNotebooks() { | |
| const urls = notebookUrlsFromInterval(); | |
| uploadNotebooks(urls) | |
| } | |
| /* Gmail Concerns */ | |
| const intervalDays = 1 | |
| const threadFilter = `from:[email protected] "kindle" newer_than:${intervalDays}d` | |
| function threadsFromLastInterval() { | |
| return GmailApp.search(threadFilter) | |
| } | |
| /* Google Drive Concerns */ | |
| const folderName = "Kindle Scribe Notes" | |
| function uploadNotebooks(urls) { | |
| const folder = notebookFolder() | |
| uploadFilesToFolder(urls, folder) | |
| } | |
| function uploadFilesToFolder(urls, folder) { | |
| urls.forEach((url) => { | |
| const blob = UrlFetchApp.fetch(url).getBlob() | |
| const file = folder.createFile(blob) | |
| const name = filenameFor(url) | |
| file.setName(name) | |
| file.setDescription(`Backup of #{name} from Kindle Scribe`) | |
| }) | |
| } | |
| function filenameFor(url) { | |
| var match = /^https?:\/\/([^\/]+)\/([^?]*\/)?([^\/?]+)/.exec(url); | |
| if (match) { | |
| return decodeURIComponent(match[3]); | |
| } | |
| return "unkown_name" | |
| } | |
| function notebookFolder() { | |
| let folders = DriveApp.getFoldersByName(folderName) | |
| console.log(`folders: ${folders.hasNext()}`) | |
| if (!folders || !folders.hasNext()) { | |
| return DriveApp.createFolder(folderName) | |
| } | |
| return folders.next() | |
| } | |
| /* URL Concerns */ | |
| function notebookUrlFrom(message) { | |
| const notebookUrlPattern = /U=(https%3A%2F%2Fkindle-content-requests-prod\.s3\.amazonaws\.com.*Signature%3[a-zA-Z0-9]{65})/ | |
| const matches = message.match(notebookUrlPattern) | |
| if (!matches) return | |
| return matches[1] | |
| } | |
| function notebookUrlsFromInterval() { | |
| return threadsFromLastInterval().map((thread) => { | |
| return thread.getMessages().map((message) => notebookUrlFrom(message.getPlainBody())) | |
| }).flat().filter((url) => !!url).map((url) => decodeURIComponent(url)) | |
| } | 
This is absolute crap code but its working for now. I'mnot able to find good docs on the match function.
Here ya go
/* URL Concerns */
function notebookUrlFrom(message) {
Logger.log(message)
//const notebookUrlPattern = /U=(https%3A%2F%2Fkindle-content-requests-prod.s3.amazonaws.com.*Signature%3[a-zA-Z0-9]{65})/
//const matches = message.match(notebookUrlPattern)
const match1 = message.match(/https/)
if (!match1) return
const Start = match1.index
Logger.log(match1)
const match2 = message.match(/)Quest/)
if (!match2) return
const End = match2.index
const Url = message.substring(Start,End)
Logger.log(Url)
return(Url)
//return matches[1]
}
Thanks for posting that @trimonkee . Is this why it would be creating the folder in google drive and not saving the file there?
@trimonkee This is my fix, for some reason it was tripping up on matching alphanumerics. Not ideal, but it works
function notebookUrlFrom(message) {
  const matches = message.match(/https:\/\/kindle\-content\-requests\-prod.s3.amazonaws.com.*Signature\=.{64}/)
  
  console.log(`${matches[0]}`)
  if (!matches) {
    return
  }
  return matches[0]
}
HI,
Thank you for this. The const matches = message.match(notebookUrlPattern)
is now failing to match for some reason. I added logging to see the message data and it looks like it should work but matches is always null.
Any thoughts on that ?