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

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

ただいまの
回答率

88.35%

指定シートで一括翻訳するコードを作成したいです

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 313

koroaisu

score 8

前提・実現したいこと

以前に指定した欄で条件と一致した場合、予めに準備した辞書のシートを使って、文章を新しい欄に一括翻訳する関数を作成しました。
今回は、指定したシートにあるすべてのデータを照合し、予めに準備した辞書シートを使って、全ての内容を上書きで一括翻訳したくて、コードをアレンジして見ましたら、エラーが発生しました。

発生している問題・エラーメッセージ

TypeError: オブジェクト Thu Oct 24 2019 00:00:00 GMT+0900 (JST) で関数 replace が見つかりません。(行 24、ファイル「コード」)

該当のソースコード

var SS_ChangeTempLanguage=SpreadsheetApp.openById('リンク先');//コードを実行するスプレッドシート 
var Dict_sheet = SS_ChangeTempLanguage.getSheetByName('dict');  // 辞書シート
var Translate_sheet = SS_ChangeTempLanguage.getSheetByName('event');  // 翻訳するシート
var JPtempDict_VauleColumn = 1; // 日本語
var CHtempDict_VauleColumn = 2; // 対応する翻訳

function TempTranslate_main(){
  var JPTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, JPtempDict_VauleColumn); //辞書シートの数値を取得
  var CHTemp_DictVaule = getColumnArrayData_Auto (Dict_sheet, CHtempDict_VauleColumn);  //辞書シートの数値を取得

  var newCHTemp_TranslateColumnArray = []; 
  var Translate_sheetValues = Translate_sheet.getDataRange().getValues();
  var lastCol=Translate_sheet.getLastColumn(); //最終列を取得して、一列ごとに翻訳を行えるようアレンジしてみました

  for(var i=1;i<Translate_sheetValues.length;i++){

    for(var x=1;x<lastCol;x++){
    var TranslateValues=Translate_sheetValues[i][x]; 
      var JPTempVaule=Translate_sheetValues[i][x];
      var TranslatedTemp=JPTempVaule;

      for (var k = 0; k < JPTemp_DictVaule.length; k++) {
        //TranslatedTemp = TranslatedTemp.replace(JPTemp_DictVaule[k][0], CHTemp_DictVaule[k][0]);
        TranslatedTemp = TranslatedTemp.replace(RegExp(JPTemp_DictVaule[k][x],'g'),CHTemp_DictVaule[k][x]); //重複した単語が存在する可能性があるため、正規表現で一括変換
      }
      newCHTemp_TranslateColumnArray.push([TranslatedTemp]);
     Translate_sheet.getRange(1,x, newCHTemp_TranslateColumnArray.length).setValues(newCHTemp_TranslateColumnArray);
    }
    }
}
function getColumnArrayData_Auto (targetSheet, startColumn) {  //データを取得する関数
  var lastRow = targetSheet.getLastRow();
  var range = targetSheet.getRange(1,startColumn, lastRow,1);
  var values = range.getDisplayValues();
  return values;
}

以前のソースコード

///*
var sheetTranslate = SpreadsheetApp.openById('リンク先').getSheetByName('desk');    // 要翻譯的Spreadsheet頁面
var sheetDict = SpreadsheetApp.openById('リンク先').getSheetByName('autoChange');  
// 變數們
var vaildRow_Auto = 1; // 這用作跳過第一行標題行, 所以預設是2
var originalScriptsColumn_Auto = 1; // 你儲存原來文本的欄
var translatedScriptsColumn_Auto = 2; // 用作儲存翻譯後文本的欄
var originalDictionaryColumn_Auto = 1; // 字典中儲存原來字符的欄
var translatedDictionaryColumn_Auto = 2; // 字典中儲存翻譯後字符的欄

function getColumnArrayData_Auto (targetSheet, startColumn) {
  var lastRow = targetSheet.getLastRow();
  var range = targetSheet.getRange(vaildRow_Auto, startColumn, lastRow - (vaildRow_Auto - 1), 1);
  var values = range.getDisplayValues();
  return values;
}

function main_Auto () {
    var originalScriptData_Auto = getColumnArrayData_Auto (sheetTranslate, originalScriptsColumn_Auto);
    var translatedScriptData_Auto = originalScriptData_Auto;
    var originalDictionaryColumnData_Auto = getColumnArrayData_Auto (sheetDict, originalDictionaryColumn_Auto);
    var translatedDictionaryColumnData_Auto = getColumnArrayData_Auto (sheetDict, translatedDictionaryColumn_Auto);

    for (var j = 0; j < originalScriptData_Auto.length; j++) {
      var tempStr_Auto = originalScriptData_Auto[j][0];

      for (var k = 0; k < originalDictionaryColumnData_Auto.length; k++) {
        //tempStr_Auto = tempStr_Auto.replace(originalDictionaryColumnData_Auto[k][0], translatedDictionaryColumnData_Auto[k][0]);
        tempStr_Auto = tempStr_Auto.replace(RegExp(originalDictionaryColumnData_Auto[k][0],'g'), translatedDictionaryColumnData_Auto[k][0]);
      }
      translatedScriptData_Auto[j][0] = tempStr_Auto;
    }
  // Logger.log(translatedScriptData);
    var translatedLastRow_Auto = translatedScriptData_Auto.length;
    var translatedRange_Auto = sheetTranslate.getRange(vaildRow_Auto, translatedScriptsColumn_Auto, translatedLastRow_Auto, 1);
    translatedRange_Auto.setValues(translatedScriptData_Auto);
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

推測する原因

エラーは省略しないでください。その消したところに答えがあるんです。
おそらくどこかのセルに日付とか数値とか文字列っぽくないデータがあるんじゃないかと思います。

対応

こういう無償で業務やってくれタイプの質問の何が困るかって、データが見れないんです。守秘契約できないんで。そういう状態でデータ起因の可能性があるエラーなんて直しようがないです。
が、ホントにこれが原因ならこう。削ったエラーメッセージやデータによってこれが違ってたら後出しの情報に応じて回答直すことになるんですよね。

      for (var k = 0; k < JPTemp_DictVaule.length; k++) {
        //TranslatedTemp = TranslatedTemp.replace(JPTemp_DictVaule[k][0], CHTemp_DictVaule[k][0]);
        if(typeof TranslatedTemp !== "string") continue;
        TranslatedTemp = TranslatedTemp.replace(RegExp(JPTemp_DictVaule[k][x],'g'),CHTemp_DictVaule[k][x]); //重複した単語が存在する可能性があるため、正規表現で一括変換
      }

ほんとにやりたいこと

やりたいことが質問から分からないです。「以前に」は、過去の質問を読めってことなんでしょうが、どれですか。全部ですか。あと「以前に、」にしないと、指定したのが以前なのかと読めます。

で、やりたいのは結局こうですか?

function q2194350() {
    const index = 1 - 1; // 日本語
    const meaning = 2 - 1; // 対応する翻訳
    const book = SpreadsheetApp.getActive();
    const dict = book.getSheetByName('dict').getDataRange().getValues().map(function(e) {return [new RegExp(e[index],'g'), e[meaning]]});
    const eventSheet = book.getSheetByName('event');
    const original = eventSheet.getDataRange().getValues();
    const converted = original.map(function(r) { return r.map(function(c) { return typeof c === "string" ? convert(c,dict) : c;} )});
    eventShee.getRange(1,1, converted.length, converted[0].length).setValues(converted);
}
function convert(str, pair) {
    return pair.reduce(function(a,c){return a.replace(c[0], c[1])},str);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/28 12:05

    この度は説明が不足しており、ご指摘の通り無駄な時間を掛けさせてしまい、また推測でしか回答できない状況で困らせてしまい、大変失礼致しました。過去のコードの追記、エラーコードの記入をさせていただきました。ご迷惑をお掛けしてしまい申し訳ございません。
    お忙しい中、ご回答頂き、誠にありがとうございます。
    頂いた回答で問題が解決されました。

    キャンセル

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る