質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

646閲覧

GoogleAppsScriptでGoogleDocsを編集したい

Test_ks

総合スコア33

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/03/18 08:31

編集2019/03/18 08:33

以下をやりたいと思っています。
・Spreadsheetに記載されたGoogleDocsのIDからGoogleDocsの内容を取得
・GoogleDocsの複製を作成する
・複製先のDocsから取得したテキストを改行毎に分ける
・分けられたテキストに対して、APIを実行し得られた結果を、複製先のDocsで置換する。

特定の文字列を覗いてうまく行っているのですが、以下のような文字列が入ってしまうと変換がうまく行きません。

・「DSSSSS(SSS)/SASDAFFSD」(replaceFirstのfindTextで無効な正規表現というエラー)
・「 」(replaceFirstでエラー)

どのように処理をすればよいか分からず教えていただけ無いかと思っております。

function createDocumentForWork() { //スプレッドシートを取得、シートを取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); //編集されたCell情報を取得 var activeCell = sheet.getActiveCell(); var activeCellValue = activeCell.getValue(); var activeRow = activeCell.getRow(); var activeColumn = activeCell.getColumn(); //アクティブセル(編集されたセル)が担当者の列以外の場合はスクリプトを終了 //※[列番号]は、A列なら1、Bなら2・・・という具合です if (activeColumn != 1) { return; } //アクティブセルが空欄の場合はスクリプトを終了 if (activeCellValue == "") { return; } //情報取得 var detail = sheet.getRange(activeRow, 1).getValue(); var templateFile = DriveApp.getFileById(detail); var OutputFileName = templateFile.getName()+'_TR'+Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss') var targetFolder = DriveApp.getFolderById("DDD"); var document = templateFile.makeCopy(OutputFileName, targetFolder); var documentUrl = document.getUrl(); var documentID = document.getId(); var aaaa = DocumentApp.openById(documentID) var docs = aaaa.getText() var ary = docs.split('\n'); var body = aaaa.getBody(); var filtered_ary = ary.filter(judge).filter(space);  //一行ずつ投げる for( var i=0; i<filtered_ary.length; i++ ){ var payload={ "payload":{ "textSnippet":{ "content":filtered_ary[i], }, } }; var ret = JSON.parse(API(payload)) var ret = ret["payload"][0] replaceFirst(body,filtered_ary[i],ret);//replaceText(filtered_ary[i], "Ap"+[i]); } sheet.getRange(activeRow,4).setValue(documentUrl); } function judge(value) { var result = value.length > 2; return result; } function space(value) { if (value != '/ +/g') { result = value return result; } } // replaces the first occurrence of old function replaceFirst(body,old,replacement) { var found = body.findText(old); Browser.msgBox(found); if (found){ var start = found.getStartOffset(); var end = found.getEndOffsetInclusive(); var text = found.getElement().asText(); text.deleteText(start, end); text.insertText(start, replacement); } } function API(payload) { var payload_json = JSON.stringify(payload) var method = "POST" var url = "https://XXXX:predict"; var accessToken = "XXXXX"; // 入手したアクセストークン var headers = { "Authorization": "Bearer "+accessToken, "Content-Type": "application/json", }; var options = { 'method': method, 'headers': headers, 'payload': JSON.stringify(payload), }; var response = UrlFetchApp.fetch(url, options); return response; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/03/19 02:16

マルチポストhttps://teratail.com/questions/180108
guest

回答1

0

ベストアンサー

  • findTextが正規表現を取る
  • "DSSSSS(SSS)/SASDAFFSD"の"/"が正規表現としてエラー

からすると

javascript

1function replaceFirst(body,old,replacement) { 2 var found = body.findText(new RegExp(old));

のようにRegExpコンストラクタで正規表現を作ればエラー回避できそうです。

後者の空白はどういうエラーかも分からないので、すみませんが、回答できません。
スペースは

javascript

1filter(space)

のところがおかしいですね。
space関数は、スペースばかりのとき、return文がないので、filterとして不適切。
また、spaceをフィルタしているということはspaceだったら動かない理由がるはずだから、

javascript

1function space(value) { 2 return !value.match(/ +/g); 3}

とかにしてあげてどうでしょうか?

投稿2019/03/18 08:52

編集2019/03/18 09:57
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Test_ks

2019/03/18 10:11

ありがとうございます!! とても参考になりました。 >のようにRegExpコンストラクタで正規表現を作ればエラー回避できそうです。 こちらなのですが、正規表現では無く”DSSSSS(SSS)/SASDAFFSD”という文字列そのもので検索したいのですが、正規表現として、認識されてしまいエラーとなってしまいます。 new RegExp(old)だと、正規表現としての表現されてしまうのですが、正規表現ではなく、単純な文字列で検索したいときにはどのようにすればよいか分からない次第です。。。 SPACEの方は、頂いたもので想定どおりの動作となりました。ありがとうございます!!!
papinianus

2019/03/19 01:59

findTextが正規表現でないといけないので、その要望は2パターンの対処があり得ると思います。 * stringにする body.getText()とすると、文字列になり、indexOfで文字列と文字列の比較が可能です(body.getText().indexOf(old);など) ただ、この場合、getStartOffsetなどが使えなくなりますので、置換部分の大幅な書換が必要になります。 * 正規表現だけど正規表現のルールがかからないようにする https://s8a.jp/javascript-escape-regexp#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%99%E3%82%8B この辺からパクってきましたが、 var found = body.findText(old.replace(/[\^$.*+?()[]{}|]/g, '\$&');); とかってやって正規表現のルールを回避するように"エスケープ"する というのはどうでしょうか?
Test_ks

2019/03/19 03:39

>* 正規表現だけど正規表現のルールがかからないようにする こちらの方法でうまく行きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問